C++基于递归和非递归算法求二叉树镜像的方法

发布时间 - 2026-01-11 01:05:06    点击率:

本文实例讲述了C++基于递归和非递归算法求二叉树镜像的方法。分享给大家供大家参考,具体如下:

/*求二叉树镜像 -- 采用递归和非递归方法
经调试可运行源码及分析如下:
***/
#include <stdlib.h>
#include <iostream>
#include <queue>
using std::cout;
using std::cin;
using std::endl;
using std::queue;
/*二叉树结点定义*/
typedef struct BTreeNode
{
  char elem;
  struct BTreeNode *pleft;
  struct BTreeNode *pright;
}BTreeNode;
/*
求二叉树镜像
递归方式步骤:
如果proot为NULL,则为空树,返回;
如果proot不为NULL,交换proot左右结点,然后分别求左右子树的镜像;
*/
/*递归求二叉树镜像*/
void get_bitree_mirror(BTreeNode* proot)
{
  if (proot == NULL)
    return ;
  BTreeNode* temp_node = proot->pleft;
  proot->pleft = proot->pright;
  proot->pright = temp_node;
  get_bitree_mirror(proot->pleft);
  get_bitree_mirror(proot->pright);
  return ;
}
/*
非递归方式步骤如下:
借助队列
首先,将根节点proot入队;
第一步:当队列非空时,获取当前层次的节点总数,即当前队列的长度;执行第二步;
第二步:按照当前层的节点总数,出队进行遍历节点,在遍历时,
    交换左右节点,如果左右节点存在,则入队;
    当遍历完当前层所有节点时,遍历下一层,执行第一步。
*/
void get_bitree_mirror_leveltraverse(BTreeNode* proot)
{
  if(proot == NULL)
    return ;
  queue <BTreeNode*> que;
  que.push(proot);
  int level_nodes_number = 0;
  while (!que.empty())//层次遍历
  {
    level_nodes_number = que.size();
    int level_count = 0;
    while (level_count < level_nodes_number)
    {
      ++level_count;
      proot = que.front();
      que.pop();
      //交换左右子节点
      BTreeNode* temp_node = proot->pleft;
      proot->pleft = proot->pright;
      proot->pright = temp_node;
      if(proot->pleft != NULL)
        que.push(proot->pleft);
      if(proot->pright != NULL)
        que.push(proot->pright);
    }
  }
  return ;
}
/*初始化二叉树根节点*/
BTreeNode* btree_init(BTreeNode* &bt)
{
  bt = NULL;
  return bt;
}
/*先序创建二叉树*/
void pre_crt_tree(BTreeNode* &bt)
{
  char ch;
  cin >> ch;
  if (ch == '#')
  {
    bt = NULL;
  }
  else
  {
    bt = new BTreeNode;
    bt->elem = ch;
    pre_crt_tree(bt->pleft);
    pre_crt_tree(bt->pright);
  }
}
/*先序遍历*/
void pre_order_traverse(BTreeNode* proot)
{
  if(proot == NULL)
    return;
  cout<< proot->elem << " ";
  pre_order_traverse(proot->pleft);
  pre_order_traverse(proot->pright);
  return;
}
int main()
{
  int tree_node_number = 0;
  BTreeNode *bt;
  btree_init(bt);//初始化根节点
  pre_crt_tree(bt);//创建二叉树
  cout << "先序遍历输出如下:" << endl;
  cout << "调用镜像函数前:" << endl;
  pre_order_traverse(bt);
  cout << endl;
  get_bitree_mirror(bt);
  cout << "递归调用镜像函数后:" << endl;
  pre_order_traverse(bt);
  cout << endl;
  cout << "非递归调用镜像函数后:" << endl;
  get_bitree_mirror_leveltraverse(bt);
  pre_order_traverse(bt);
  cout << endl;
  system("pause");
  return 0;
}

/*
运行结果:
a b c # # # d e # # #
------以上为输入-----------
------以下为输出-----------
先序遍历输出如下:
调用镜像函数前:
a b c d e
递归调用镜像函数后:
a d e b c
非递归调用镜像函数后:
a b c d e
请按任意键继续. . .
---------------------------------
本例创建的二叉树形状:
    a
  b    d
c     e
调用递归求二叉树镜像形状:
   a
d    b
  e    c
再次调用非递归求二叉树镜像形状(即镜像的镜像):
    a
  b    d
c     e
*/

希望本文所述对大家C++程序设计有所帮助。


# C++  # 递归  # 非递归  # 算法  # 二叉树  # 镜像  # C++ 非递归实现二叉树的前中后序遍历  # C++ 数据结构二叉树(前序/中序/后序递归、非递归遍历)  # C++使用递归和非递归算法实现的二叉树叶子节点个数计算方法  # C++基于递归和非递归算法判定两个二叉树结构是否完全相同(结构和数据都相同)  # C++非递归队列实现二叉树的广度优先遍历  # C++非递归建立二叉树实例  # C++二叉树的前序中序后序非递归实现方法详细讲解  # 遍历  # 子树  # 第二步  # 给大家  # 不为  # 请按  # 则为  # 所述  # 程序设计  # 上为  # 本例  # 下一层  # 讲述了  # std  # cout  # queue  # gt 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 如何将凡科建站内容保存为本地文件?  lovemo网页版地址 lovemo官网手机登录  矢量图网站制作软件,用千图网的一张矢量图做公司app首页,该网站并未说明版权等问题,这样做算不算侵权?应该如何解决?  HTML5空格和margin有啥区别_空格与外边距的使用场景【说明】  制作ppt免费网站有哪些,有哪些比较好的ppt模板下载网站?  详解Huffman编码算法之Java实现  Laravel如何使用Sanctum进行API认证?(SPA实战)  简历没回改:利用AI润色让你的文字更专业  Laravel的路由模型绑定怎么用_Laravel Route Model Binding简化控制器逻辑  百度输入法ai组件怎么删除 百度输入法ai组件移除工具  如何在建站之星绑定自定义域名?  大连 网站制作,大连天途有线官网?  Windows驱动无法加载错误解决方法_驱动签名验证失败处理步骤  Laravel中间件如何使用_Laravel自定义中间件实现权限控制  Laravel storage目录权限问题_Laravel文件写入权限设置  猪八戒网站制作视频,开发一个猪八戒网站,大约需要多少?或者自己请程序员,需要什么程序员,多少程序员能完成?  如何在服务器上三步完成建站并提升流量?  简单实现Android文件上传  香港服务器网站测试全流程:性能评估、SEO加载与移动适配优化  北京网站制作公司哪家好一点,北京租房网站有哪些?  html5如何实现懒加载图片_ intersectionobserver api用法【教程】  laravel怎么实现图片的压缩和裁剪_laravel图片压缩与裁剪方法  Laravel如何使用.env文件管理环境变量?(最佳实践)  专业商城网站制作公司有哪些,pi商城官网是哪个?  Laravel怎么集成Log日志记录_Laravel单文件与每日日志配置及自定义通道【详解】  实例解析angularjs的filter过滤器  大连网站制作费用,大连新青年网站,五年四班里的视频怎样下载啊?  Laravel怎么使用Collection集合方法_Laravel数组操作高级函数pluck与map【手册】  JavaScript常见的五种数组去重的方式  Laravel怎么实现软删除SoftDeletes_Laravel模型回收站功能与数据恢复【步骤】  laravel怎么用DB facade执行原生SQL查询_laravel DB facade原生SQL执行方法  如何用狗爹虚拟主机快速搭建网站?  JS碰撞运动实现方法详解  制作网站软件推荐手机版,如何制作属于自己的手机网站app应用?  javascript中对象的定义、使用以及对象和原型链操作小结  Laravel中的withCount方法怎么高效统计关联模型数量  西安专业网站制作公司有哪些,陕西省建行官方网站?  Laravel如何使用withoutEvents方法临时禁用模型事件  Laravel如何使用Seeder填充数据_Laravel模型工厂Factory批量生成测试数据【方法】  Laravel如何处理JSON字段的查询和更新_Laravel JSON列操作与查询技巧  如何快速生成专业多端适配建站电话?  微信公众帐号开发教程之图文消息全攻略  Laravel如何使用Telescope进行调试?(安装和使用教程)  Laravel如何使用查询构建器?(Query Builder高级用法)  详解vue.js组件化开发实践  node.js报错:Cannot find module &#39;ejs&#39;的解决办法  北京网站制作的公司有哪些,北京白云观官方网站?  大连网站制作公司哪家好一点,大连买房网站哪个好?  如何在阿里云域名上完成建站全流程?  Laravel如何实现API速率限制?(Rate Limiting教程)