剑指offer 树的子结构

题目描述

输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)

题目分析

在比较树的子结构时,我们可以进行如下考虑:

  • 如果B树为A树的子结构,那么,A的某个结构T的根节点与B的根节点相同,并且T的左子树等于B的左子树,T的右子树等于B的右子树
  • 其余情况则B不为A的子结构
  • 根据以上情况我们可以使用递归的方式,比较A的所有结构的根节点与B的根节点,进行子结构比较即可。

java代码

public static boolean DoesT1IncludeT2(TreeNode root1,TreeNode root2){
         if(root2==null){//B树遍历完成,说明B是T的子结构
             return true;
         }
         if(root1==null){//B未完成而T无节点
             return false;
         }
         if(root1.val!=root2.val){// A与T根节点不同
             return false;
         }
         return DoesT1IncludeT2(root1.left,root2.left)&&DoesT1IncludeT2(root1.right,root2.right);//继续进行比较T与B的左右结构
     }


     public boolean HasSubtree(TreeNode root1,TreeNode root2) {
         boolean ans = false;
          if(root1==null || root2==null){//空树不为子结构
              return false;
          }
          if(root1.val == root2.val){
              ans = DoesT1IncludeT2(root1,root2);//A与B进行比较
          }
          if (ans!=true){
              ans = HasSubtree(root1.left,root2);//A左子树与B进行比较
          }
         if (ans!=true){
             ans = HasSubtree(root1.right,root2);//A右子树与B进行比较
         // 有一个为true那么就是真
         return ans;
     }
剑指offer 树的子结构剑指offer 树的子结构 FiveWords 发布了22 篇原创文章 · 获赞 2 · 访问量 361 私信 关注
上一篇:面试题28:对称的二叉树


下一篇:F - 食物链 POJ - 1182