判断两颗二叉树是否相似的两种方法

 更新时间:2019年03月05日 15:56:16   作者:BLSxiaopanlaile  
今天小编就为大家分享一篇关于判断两颗二叉树是否相似的两种方法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧

名称:判断两个二叉树是否相似

说明:此处的两个方法一个是非递归,一个是递归算法。其实两个算法的本质思路是一样的就是,判断位置相同的两个结点是否同时为空或同时不为空。只是具体的实现不一样。

对于层次遍历法:此处不小心用错了,本应该用队列来当作排列下一层元素的。歪打正着,此处用栈也可以,只是判断的结点顺序不一样。队列的话,是从每一层的左端到右端。栈的话,是从右端到左端。在此处都没影响。我去,有发现一点,要从右到左访问一层的元素的话,应该用栈。

对于递归,看起来比非递归要简单不少。基本的思路很简单,要注意的是,在程序需要从子树接收返回是否相似的信息。这样的话,有一个问题,就是必须等树完全判断完才可以最终返回。不想上面的,过程中发现不一样就可以立即返回了。

//层次遍历法判断两棵树是否相似
bool IsSemblable1(BiTree T1,BiTree T2)
{
  stack<BiTNode* > _sta1,_sta2;  //用来存放下一层元素的容器,此处栈和队列都行
  BiTNode *p1 = T1,*p2 = T2;   //p1用来跟踪T1,p2用来跟踪T2
  while((_sta1.empty() == false || p1 != NULL) &&(_sta2.empty() == false || p2 != NULL))
  {
    if(p1 != NULL && p2 != NULL )  //如果p1和p2都不为空时
    {
      if(p1->lchild != NULL && p2->lchild != NULL)  //如果p1和p2的左子树都不为空时
      {
        _sta1.push(p1->lchild);
        _sta2.push(p2->lchild);
      }
      else if( p1->lchild != NULL || p2->lchild != NULL)  //如果p1的左子树为空,但是p2的左子树不为空,或者相反
        return false;
      if(p1->rchild != NULL && p2->rchild != NULL)   //如果p1和p2的右子树都不为空时
      {
        _sta1.push(p1->rchild);
        _sta2.push(p2->rchild);
      }
      else if(p1->rchild != NULL || p2->rchild != NULL)  //如果p1的右子树为空,但是p2的右子树不为空,或者相反
        return false;
      //访问完两棵树的当前结点后,置空让下一次循环弹出栈中元素(此处其实直接弹出元素也行)
      p1 = NULL;
      p2 = NULL;
    }
    else if(p1 != NULL || p2 != NULL)    //当前节点有一个为空
      return false;
    else
    {
      //弹出两个树的栈顶元素
      p1 = _sta1.top();
      p2 = _sta2.top();
      _sta1.pop();
      _sta2.pop();
    }
  }
  return true;
}
//递归判断两棵树是否相似
bool IsSemblable2(BiTree T1,BiTree T2)
{
  bool leftS = false,rightS = false;   //用来接受子树返回的信息
  if(T1 == NULL && T2 == NULL)    //两个结点都为空
    return true;
  else if(T1 == NULL || T2 == NULL)  //有一个结点不为空
    return false;
  else
  {
    int leftS = IsSemblable2(T1->lchild,T2->lchild);  //递归左子树
    int rightS = IsSemblable2(T1->rchild,T2->rchild);  //递归右子树
    return leftS && rightS ;  //返回两个子树的信息
  }
}

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对脚本之家的支持。如果你想了解更多相关内容请查看下面相关链接

相关文章

  • 如何给随机数加密

    如何给随机数加密

    随机数加密的简单算法,需要的朋友可以参考一下
    2013-03-03
  • 详解C语言面向对象编程中的封装

    详解C语言面向对象编程中的封装

    这篇文章主要为大家详细介绍了C语言面向对象编程中的封装,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-03-03
  • C++日期类计算器的模拟实现举例详解

    C++日期类计算器的模拟实现举例详解

    两个日期之间相隔天数的计算网上有许多的软件,这里主要介绍如何使用C/C++语言来完成这样的功能,下面这篇文章主要给大家介绍了关于C++日期类计算器的模拟实现,需要的朋友可以参考下
    2023-04-04
  • C语言数据结构进阶之栈和队列的实现

    C语言数据结构进阶之栈和队列的实现

    栈和队列,严格意义上来说,也属于线性表,因为它们也都用于存储逻辑关系为 "一对一" 的数据,但由于它们比较特殊,因此将其单独作为一章,做重点讲解
    2021-11-11
  • VC++中HTControl的CHTButton按钮控件类用法实例解析

    VC++中HTControl的CHTButton按钮控件类用法实例解析

    这篇文章主要介绍了VC++中HTControl的CHTButton按钮控件类用法,对于大家进行VC++项目开发有一定的帮助作用,需要的朋友可以参考下
    2014-08-08
  • C++超详细讲解单链表的实现

    C++超详细讲解单链表的实现

    单链表是后面要学的双链表以及循环链表的基础,要想继续深入了解数据结构以及C++,我们就要奠定好这块基石!接下来就和我一起学习吧
    2022-03-03
  • C语言控制进程之进程等待详解

    C语言控制进程之进程等待详解

    这篇文章主要介绍了C语言控制进程之进程等待即回收子进程的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08
  • C++中实现fibonacci数列的几种方法

    C++中实现fibonacci数列的几种方法

    本文主要介绍了C++中实现fibonacci数列的几种方法,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • C语言PlaySound函数使用方法

    C语言PlaySound函数使用方法

    这篇文章介绍了C语言PlaySound函数的使用方法,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-12-12
  • 详解PID控制器原理

    详解PID控制器原理

    什么是 PID?它是一种在编程中使用的基本方法,如果正确调整,可以令人难以置信的有效和准确,PID代表比例积分微分,3个单独的部分连接在一起,虽然有时你不需要三个都使用。例如,您可以改为有P控制,PI控制或PD控制
    2021-06-06

最新评论