剑指Offer26. 树的子结构
输入两棵二叉树A和B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构)
B是A的子结构, 即 A中有出现和B相同的结构和节点值。
例如:
给定的树 A:
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/shu-de-zi-jie-gou-lcof
class Solution {
public boolean isSubStructure(TreeNode A, TreeNode B) {
//思路:(假设节点的value可能存在相同的情况)
//1. 遍历A找到B的根,找到之后同时遍历A和B,,
//2. 如果一样则返回true,跳到4
//3. 不一样,返回1
//4. 返回结果
if (A == null || B == null) return false;
if (A.val == B.val){//先判断A的根是不是B的根
if (isSubTree(A,B))
return true;
}
//如果A的根不是B的根,在对左右子树进行判断
boolean isLeft = isSubStructure(A.left,B);
boolean isRight = isSubStructure(A.right,B);
return isLeft || isRight; //只要左右子树有一个匹配就算匹配成功
}
private boolean isSubTree(TreeNode A, TreeNode B){//判断B是不是A的子树
if (A == null && B != null) return false;// 当B不空时,A肯定不能空,否则B就不是A的子树
if (A.val == B.val){//条件1:A和B节点的值的相等
boolean subLeft = true;//注意,初始为true,即若B没有左子树不管A有没有B都是A的子树
if (B.left != null){//条件2:如果B的左子树存在,递归左子树
subLeft = isSubTree(A.left,B.left);
}
boolean subRight = true;//条件3:右子树同理
if (B.right != null){
subRight = isSubTree(A.right,B.right);
}
return subLeft && subRight;//必须同时满足条件1、2、3 才能保证B是A的子树
}
return false; // A.val != B.val
}
}