本文实例讲述了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;
/*初始化二叉树节点*/
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);
}
}
/*
递归方式:
如果两个二叉树proot都为空树,则自然相同,返回true;
如果两个二叉树proot一个为空树,另一个不为空树,则不相同,返回false;
如果两个二叉树的数据不相等,返回false;
如果两个二叉树都不为空树,则需要分别比较左右子树后,根据比较结果共同判定,只要有一个为false,则返回false。
*/
/*递归判断两个二叉树是否相等(结构和数据)*/
bool bitree_compare(BTreeNode* proot1, BTreeNode* proot2)
{
if (proot1 == NULL && proot2 == NULL)//都为空
return true;
if((proot1 != NULL && proot2 == NULL) ||
(proot1 == NULL && proot2 != NULL))//一个空,一个非空
return false;
/*比较元素*/
if(proot1->elem != proot2->elem)
return false;
bool left_compare = bitree_compare(proot1->pleft, proot2->pleft);
bool right_compare = bitree_compare(proot1->pright, proot2->pright);
return (left_compare && right_compare);
}
/*
非递归方式
借助队列实现
实现算法:
首先将给定根节点proot1和proot2都入队
第一步:当两个队列未空时,分别获取两个树的当前层次中节点总数(即当前队列中节点个数),
先比较节点个数是否相同,如果不相同,则两个树自然不同;
如果节点个数相同,需要出队进行比较(数据也要比较)。如果有一个队列未空,则退出比较。
第二步:如果有一个队列未空,则清空队列并返回不同。
*/
/*非递归方式判断两个二叉树是否相等(仅仅结构)*/
bool bitree_compare_leveltraverse(BTreeNode* proot1, BTreeNode* proot2)
{
if (proot1 == NULL && proot2 == NULL)//都为空
return true;
queue <BTreeNode*> que1;
queue <BTreeNode*> que2;
que1.push(proot1);
que2.push(proot2);
int cur_level_nodes_num1 = 0;
int cur_level_nodes_num2 = 0;
bool flag = true;
while (!que1.empty() && !que2.empty())
{
cur_level_nodes_num1 = que1.size();
cur_level_nodes_num2 = que2.size();
//节点数目不一样时flag设为false,退出循环
if (cur_level_nodes_num1 != cur_level_nodes_num2)
{
flag = false;
break;
}
int cur_level_node_count1 = 0;
int cur_level_node_count2 = 0;
while (cur_level_node_count1 < cur_level_nodes_num1 &&
cur_level_node_count2 < cur_level_nodes_num2)
{
++cur_level_node_count1;
++cur_level_node_count2;
proot1 = que1.front();
que1.pop();
proot2 = que2.front();
que2.pop();
/*元素数据比较*/
if(proot1->elem != proot2->elem)
{
flag = false;
break;
}
//判断左右孩子是否相同,不同肯定结构不相同,提前break
if( proot1->pleft == NULL && proot2->pleft != NULL ||
proot1->pleft != NULL && proot2->pleft == NULL ||
proot1->pright == NULL && proot2->pright != NULL ||
proot1->pright != NULL && proot2->pright == NULL)
{
flag = false;
break;
}
/*下一层的节点入队*/
if(proot1->pleft)
que1.push(proot1->pleft);
if(proot1->pright)
que1.push(proot1->pright);
if(proot2->pleft)
que2.push(proot2->pleft);
if(proot2->pright)
que2.push(proot2->pright);
}
if(flag == false)
break;
}
if(flag == false)
{
while(!que1.empty())
que1.pop();
while(!que2.empty())
que2.pop();
cout << "非递归:reslut is false." << endl;
return false;
}else
{
cout << "非递归:reslut is true." << endl;
return true;
}
return true;
}
int main()
{
BTreeNode *bt1;
BTreeNode* bt2;
bool flag;
btree_init(bt1);//初始化根节点
btree_init(bt2);//初始化根节点
cout << "creat 1th tree:" << endl;
pre_crt_tree(bt1);//创建二叉树
cout << "creat 2th tree:" << endl;
pre_crt_tree(bt2);//创建二叉树
/*递归测试*/
flag = bitree_compare(bt1, bt2);
if(flag == true)
cout<< "递归:result is true." << endl;
else
cout << "递归:result is false." << endl;
/*非递归测试*/
bitree_compare_leveltraverse(bt1, bt2);
system("pause");
return 0;
}
/*
测试结果如下:
creat 1th tree:
a b c # # # d e # # f # g # #
creat 2th tree:
a b c # # # d e # # f # g # #
递归:result is true.
非递归:reslut is true.
请按任意键继续. . .
------------------分界线-----------------------
creat 1th tree:
a b c # # # d # #
creat 2th tree:
a b c # # # x # #
递归:result is false.
非递归:reslut is false.
请按任意键继续. . .
本例创建的二叉树形状:
a b c # # # d e # # f # g # # 如下:
a
b d
c e f
g
a b c # # # d # # 如下:
a
b d
c
a b c # # # x # # 如下:
a
b x
c
*/
希望本文所述对大家C++程序设计有所帮助。
# C++
# 递归
# 非递归
# 算法
# 判定
# 二叉树
# 完全相同
# C++ 非递归实现二叉树的前中后序遍历
# C++ 数据结构二叉树(前序/中序/后序递归、非递归遍历)
# C++使用递归和非递归算法实现的二叉树叶子节点个数计算方法
# C++基于递归和非递归算法求二叉树镜像的方法
# C++非递归队列实现二叉树的广度优先遍历
# C++非递归建立二叉树实例
# C++二叉树的前序中序后序非递归实现方法详细讲解
# 为空
# 子树
# 请按
# 有一个
# 都不
# 也要
# 设为
# 给大家
# 第二步
# 所述
# 程序设计
# 清空
# 则需
# 本例
# 下一层
# 只要有
# 不相等
相关文章:
香港服务器如何优化才能显著提升网站加载速度?
c++23 std::expected怎么用 c++优雅处理函数错误返回【详解】
Swift开发中switch语句值绑定模式
安云自助建站系统如何快速提升SEO排名?
如何在云主机快速搭建网站站点?
电影网站制作价格表,那些提供免费电影的网站,他们是怎么盈利的?
定制建站哪家更专业可靠?推荐榜单揭晓
武汉网站设计制作公司,武汉有哪些比较大的同城网站或论坛,就是里面都是武汉人的?
西安大型网站制作公司,西安招聘网站最好的是哪个?
建站主机CVM配置优化、SEO策略与性能提升指南
制作网站的网址是什么,请问后缀为.com和.com.cn还有.cn的这三种网站是分别是什么类型的网站?
宝塔建站助手安装配置与建站模板使用全流程解析
无锡制作网站公司有哪些,无锡优八网络科技有限公司介绍?
如何快速查询网址的建站时间与历史轨迹?
,sp开头的版面叫什么?
如何通过云梦建站系统实现SEO快速优化?
如何在企业微信快速生成手机电脑官网?
建站之星如何优化SEO以实现高效排名?
如何通过PHP快速构建高效问答网站功能?
宿州网站制作公司兴策,安徽省低保查询网站?
ppt在线制作免费网站推荐,有什么下载免费的ppt模板网站?
制作网站的软件免费下载,免费制作app哪个平台好?
如何用手机制作网站和网页,手机移动端的网站能制作成中英双语的吗?
如何配置FTP站点权限与安全设置?
已有域名如何快速搭建专属网站?
,如何利用word制作宣传手册?
如何在Mac上搭建Golang开发环境_使用Homebrew安装和管理Go版本
如何做静态网页,sublimetext3.0制作静态网页?
专业制作网站的公司哪家好,建立一个公司网站的费用.有哪些部分,分别要多少钱?
建站之星Pro快速搭建教程:模板选择与功能配置指南
微网站制作教程,我微信里的网站怎么才能复制到浏览器里?
Swift中swift中的switch 语句
保定网站制作方案定制,保定招聘的渠道有哪些?找工作的人一般都去哪里看招聘信息?
怎么用手机制作网站链接,dw怎么把手机适应页面变成网页?
5种Android数据存储方式汇总
上海网站制作开发公司,上海买房比较好的网站有哪些?
网站制作外包价格怎么算,招聘网站上写的“外包”是什么意思?
建站DNS解析失败?如何正确配置域名服务器?
如何访问已购建站主机并解决登录问题?
建站主机选择指南:服务器配置与SEO优化实战技巧
官网自助建站系统:SEO优化+多语言支持,快速搭建专业网站
建站之星代理如何优化在线客服效率?
网站制作话术技巧,网站推广做的好怎么话术?
如何快速搭建个人网站并优化SEO?
网站制作服务平台,有什么网站可以发布本地服务信息?
如何制作网站标识牌,动态网站如何制作(教程)?
免费公司网站制作软件,如何申请免费主页空间做自己的网站?
百度网页制作网站有哪些,谁能告诉我百度网站是怎么联系?
Thinkphp 中 distinct 的用法解析
C#如何在一个XML文件中查找并替换文本内容
*请认真填写需求信息,我们会在24小时内与您取得联系。