剑指Offer(26)树的子结构

目录

树的子结构

描述

示例 1

示例 2

限制

数据结构

方法:递归


树的子结构

描述

输入两棵二叉树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

数据结构

public class TreeNode {
    int val;
    TreeNode left;
    TreeNode right;
    TreeNode(int x) { val = x; }
}

方法:递归

我们利用递归,循环比较A、B的结构,子树结构是否相同。

需要注意的是,有可能A的子树与B结构相同。

class Solution {
    public boolean isSubStructure(TreeNode A, TreeNode B) {
        if (B==null || A==null){
            return false;
        }
        return isSubTree(A,B)||isSubStructure(A.left,B)||isSubStructure(A.right,B);//递归调用当前节点与B、左子树与B、右子树与B的结构是否相同
    }

    public boolean isSubTree(TreeNode A, TreeNode B){
        if (B==null) return true;//如果B遍历完了,则认为结构相同
        if (A==null || A.val!=B.val) return false;//如果A遍历完了B还没,或者A、B的值不同,则认为结构不同
        return isSubTree(A.left,B.left)&&isSubTree(A.right,B.right);//如果A、B值相同,递归比较A、B的左右子树结构是否相同
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_39478524/article/details/120647240