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 】
相关推荐:
Laravel如何使用Service Provider服务提供者_Laravel依赖注入与容器绑定【深度】
Windows10怎样连接蓝牙设备_Windows10蓝牙连接步骤【教程】
昵图网官方站入口 昵图网素材图库官网入口
Laravel如何实现事件和监听器?(Event & Listener实战)
Laravel Debugbar怎么安装_Laravel调试工具栏配置指南
Laravel如何集成微信支付SDK_Laravel使用yansongda-pay实现扫码支付【实战】
Laravel如何创建自定义Facades?(详细步骤)
Python3.6正式版新特性预览
香港网站服务器数量如何影响SEO优化效果?
教你用AI润色文章,让你的文字表达更专业
Laravel如何实现数据导出到CSV文件_Laravel原生流式输出大数据量CSV【方案】
UC浏览器如何切换小说阅读源_UC浏览器阅读源切换【方法】
Laravel如何使用Blade模板引擎?(完整语法和示例)
Laravel观察者模式如何使用_Laravel Model Observer配置
Laravel怎么写单元测试_PHPUnit在Laravel项目中的基础测试入门
Midjourney怎么调整光影效果_Midjourney光影调整方法【指南】
详解jQuery停止动画——stop()方法的使用
HTML5空格和nbsp有啥关系_nbsp的作用及使用场景【说明】
Laravel广播系统如何实现实时通信_Laravel Reverb与WebSockets实战教程
大连网站制作费用,大连新青年网站,五年四班里的视频怎样下载啊?
Laravel怎么清理缓存_Laravel optimize clear命令详解
Laravel 419 page expired怎么解决_Laravel CSRF令牌过期处理
微信小程序 wx.uploadFile无法上传解决办法
微信小程序 input输入框控件详解及实例(多种示例)
C#如何调用原生C++ COM对象详解
Laravel API资源类怎么用_Laravel API Resource数据转换
如何在VPS电脑上快速搭建网站?
深圳网站制作设计招聘,关于服装设计的流行趋势,哪里的资料比较全面?
Laravel如何实现用户角色和权限系统_Laravel角色权限管理机制
如何正确下载安装西数主机建站助手?
jQuery 常见小例汇总
Bootstrap整体框架之JavaScript插件架构
Laravel如何使用Scope本地作用域_Laravel模型常用查询逻辑封装技巧【手册】
网页设计与网站制作内容,怎样注册网站?
Laravel怎么实现模型属性的自动加密
Laravel如何与Pusher实现实时通信?(WebSocket示例)
如何在 Python 中将列表项按字母顺序编号(a.、b.、c. …)
如何在香港服务器上快速搭建免备案网站?
如何利用DOS批处理实现定时关机操作详解
郑州企业网站制作公司,郑州招聘网站有哪些?
公司门户网站制作流程,华为官网怎么做?
如何用PHP快速搭建CMS系统?
如何在腾讯云服务器上快速搭建个人网站?
百度输入法ai组件怎么删除 百度输入法ai组件移除工具
为什么要用作用域操作符_php中访问类常量与静态属性的优势【解答】
Laravel怎么实现搜索高亮功能_Laravel结合Scout与Algolia全文检索【实战】
Laravel如何实现图片防盗链功能_Laravel中间件验证Referer来源请求【方案】
Linux安全能力提升路径_长期防护思维说明【指导】
如何在IIS中配置站点IP、端口及主机头?
如何自定义safari浏览器工具栏?个性化设置safari浏览器界面教程【技巧】

