剑指 Offer 26. 树的子结构

剑指 Offer 26. 树的子结构

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

B是A的子结构, 即 A中有出现和B相同的结构和节点值。

例如:
给定的树 A:

   3
  / \
 4   5
  / \
 1   2

给定的树 B:

   4 
  /
 1

返回 true,因为 B 与 A 的一个子树拥有相同的结构和节点值。

示例 1:

输入:A = [1,2,3], B = [3,1]
输出:false

示例 2:

输入:A = [3,4,5,1,2], B = [4,1]
输出:true

限制:

  • 0 <= 节点个数 <= 10000

算法思路:

isSubStructure(A, B) 函数

  • 如果A为空或者B为空,则返回false;

  • recur(A,B)如果B是A的子树,则返回true,否则看

    • isSubStructure(A.left, B)的A的左子树是B的子树
    • 或者isSubStructure(A.right, B)的A的右子树是B的子树

recur(A, B) 函数:

  • 当节点B为空,说明B已经被匹配过了,则返回true
  • 当A为空 说明越过了A的树的子节点 或者A的值不等于B的值,则返回false
  • 返回值看recur(A.left,B.left)判断A和B的左子节点是否相等,返回则为true
  • 看recur(A.left, B.left)判断A和B的右子节点是否相等,返回则为true
class Solution {
    public boolean isSubStructure(TreeNode A, TreeNode B) {
        if (A == null || B == null) 
            return false;
        return recur(A, B) || isSubStructure(A.left, B) || isSubStructure(A.right, B);
    }

    boolean recur(TreeNode A, TreeNode B) {
        if (B == null) 
            return true;
        if (A == null || A.val != B.val) 
            return false;
        return recur(A.left,B.left) && recur(A.left, B.left);
    }
}

k神的代码更为简洁,见代码如下:

class Solution {
    public boolean isSubStructure(TreeNode A, TreeNode B) {
        return (A != null && B != null) && (recur(A, B) || isSubStructure(A.left, B) || isSubStructure(A.right, B));
    }
    boolean recur(TreeNode A, TreeNode B) {
        if(B == null) return true;
        if(A == null || A.val != B.val) return false;
        return recur(A.left, B.left) && recur(A.right, B.right);
    }
}

以及力友分享的注释版本:

class Solution {
    //参考视频讲解:https://www.bilibili.com/video/BV1pK4y177jA?from=search&seid=7308257970624224318
    public boolean isSubStructure(TreeNode A, TreeNode B) {
      if(A==null || B==null) return false;//约定空树不是任意一个树的子结构
      if(helper(A,B)) return true;
      return isSubStructure(A.left,B) || isSubStructure(A.right,B);//递归判断A树所有子树是否包含B树
    }
    //该函数的作用是:判断A树根节点值和B树根节点值是否相等,若不等,返回false,若相等在递归判断A树的孩子节点和B树的的孩子节点是否对应相等,如果对应相等了,就说明A的子结构包含B树,返回true。否者就不包含,返回false
    public boolean helper(TreeNode A,TreeNode B){
        if(B==null) return true;
        if(A==null || A.val!=B.val) return false;//A树为空或者A节点的值不等于B结点的值,返回false
        return helper(A.left,B.left) && helper(A.right,B.right);//当A.val==B.val时,递归判断A树的子节点和B树的子节点是否对应相等
    }
}

参考链接:

https://leetcode-cn.com/problems/shu-de-zi-jie-gou-lcof/solution/mian-shi-ti-26-shu-de-zi-jie-gou-xian-xu-bian-li-p/

posted @ 2021-09-02 17:33  RainsX  阅读(65)  评论(0编辑  收藏  举报