如果f是由有序树t转换而来的二叉树,

  如果f是由有序树t转换而来的二叉树,

  进入两个二叉树A和B,判断B是否是A的子结构。

  我们规定空树不是任何树的子结构。

  样品

  树a:

  八

  /\

  8 7

  /\

  9 2

  /\

  7树B:

  八

  /\

  9返回true,因为B是a的子结构。

  想法(二叉树,递归)

  代码分为两部分:

  遍历树a中所有非空节点r;判断树A中以R为根节点的子树是否包含与树B相同的结构,我们从根节点开始匹配;对于第一部分,我们可以直接递归遍历树A。当我们遇到非空节点时,我们会做出第二部分的判断。

  对于第二部分,我们从根节点同时遍历两个子树:

  如果树B中的节点为空,则表示当前分支匹配,返回true;如果树A中的节点为空,但树B中的节点不为空,则表示没有匹配,为false被返回;如果两个节点都不为空,但值不同,则说明不匹配,为false被返回;否则匹配当前点,然后分别递归判断左子树和右子树是否匹配。时间复杂度

  最坏的情况下,我们要递归判断树A中的每个节点,最坏的情况下每个判断需要遍历树B中的所有节点。

  所以时间复杂度是,其中树A的节点数是树b的节点数。

  代码/* *

  *二叉树节点的定义。

  *结构树节点{

  * int val

  * TreeNode * left

  * TreeNode * right

  * TreeNode(int x) : val(x),left(NULL),right(NULL) {}

  * };

  */

  类别解决方案{

  公共:

  bool has sub tree(TreeNode * proof 1,TreeNode * proof 2){

  如果(!pRoot1 !pRoot2)返回false//如果A树或B树为空,则返回false

  if(is same(proof 1,pRoot2))返回true//从根节点开始匹配

  //如果从根节点不匹配,我们就递归到A的左右子树进行匹配。

  if(has subtree(proof 1-left,proof 2) has subtree(proof 1-right,proof 2))返回true

  }

  bool is same(TreeNode * proof 1,TreeNode * pRoot2)

  {

  如果(!pRoot2)返回true//B树为空,匹配成功,递归终点结束。

  如果(!proof 1 proof 1-val!=pRoot2- val)返回false

  //否则表示当前点匹配,然后分别递归判断左子树和右子树是否匹配。

  return is name(proof 1-left,proof 2-left)is name(proof 1-right,proof 2-right);

  }

  };

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

相关文章阅读

  • 二叉树深度遍历算法,多叉树的深度优先遍历
  • C++创建二叉树,C++实现二叉树
  • 如果希望按照非递减顺序访问二叉树所有节点,二叉树中至少包含一个节点
  • 二叉查找树镜像,镜像对称二叉树
  • 完全二叉树的先序遍历,请写出该二叉树的先序和层次遍历的序列
  • 二叉搜索树和二叉查找树,二叉树 二叉搜索树区别
  • 二叉树查找第k个最小元素,找出二叉搜索树第k小的节点
  • 判断二叉树是否是平衡二叉树,b+树是不是平衡二叉树
  • 二叉链表实现完全二叉树,采用三叉链表存储二叉树
  • 二叉树的三种遍历方式是什么,二叉树的三种遍历方式是
  • java二叉树排序算法,二叉排序树的实现
  • java二叉树的遍历算法代码,编程实现二叉树的遍历算法
  • java二叉树删除,二叉树查找算法java
  • java二叉树查找,二叉搜索树的定义
  • 留言与评论(共有 条评论)
       
    验证码: