千家信息网

如何判定C++递归和非递归算法中两个二叉树结构是否完全相同

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,如何判定C++递归和非递归算法中两个二叉树结构是否完全相同,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。具体如下:/*两个二叉树结构是否
千家信息网最后更新 2026年11月01日如何判定C++递归和非递归算法中两个二叉树结构是否完全相同

如何判定C++递归和非递归算法中两个二叉树结构是否完全相同,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

具体如下:

/*两个二叉树结构是否相同(结构和数据都相同) -- 递归和非递归方法经调试可运行源码及分析如下:***/#include #include #include 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  que1;  queue  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    dc     e  f       ga b c # # # d # # 如下:    a  b    dca b c # # # x # # 如下:    a  b    xc*/

看完上述内容,你们掌握如何判定C++递归和非递归算法中两个二叉树结构是否完全相同的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注行业资讯频道,感谢各位的阅读!

递归 两个 相同 节点 结构 队列 数据 算法 不同 个数 方式 方法 测试 C++ 内容 更多 结果 自然 问题 束手无策 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 厦门中拓互联网络科技有限公司 深圳互联网科技公司 互联网科技大会 人人互联网科技是培训 重庆科技学院互联网 华服互联网科技官网 栖莱科技互联网股份有限公司 昊天互联网科技有限公司 华夏互联网科技业 宜昌元轩互联网科技有限公司 恒生互联网科技指数跳水 互联网行业科技股 互联网科技年终奖 全球科技与互联网公司市值变化 万物互联网智能科技 北京互联网科技类企业分布 互联网科技和医药行业 长沙易易互联网科技有限公司 科技互联网企业在行动 银川新华互联网科技学校招聘 互联网巨头反垄断金融科技 小马过河互联网科技 火传媒上海互联网科技 玖二柒互联网科技公司待遇 崇明区互联网教育科技售后服务 开一家科技互联网公司需要多少钱 本届互联网博览会上的黑科技 洛阳共同富裕互联网科技有限公司 广州富喜互联网络科技 互联网科技手抄报图片
0