目录
树的子结构
描述
输入两棵二叉树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的左右子树结构是否相同
}
}