实现思路:
- step 1:因为空树不是任何树的子树,所以要先判断B树是否为空树。
- step 2:当A树为空节点,但是B树还有节点的时候,不为子树,但是A树不为空节点,B树为空节点时可以是子树。
- step 3:每次递归比较A树从当前节点开始,是否与B树完全一致,同步前序遍历。
- step 4:A树自己再前序遍历进入子节点,当作子树起点再与B树同步遍历。
- step 5:以上情况任意只要有一种即可。
代码实现:
public class Solution {
//把节点的子节点一一比较
private boolean test(TreeNode root1,TreeNode root2){
//root 和 root2 是变量
//如过a树为空,b树不为空则是fasle
if(root1 == null && root2 != null) return false;
//如过a树不为空b树为空,或者a,b树都为空则是true
if(root1 == null || root2 == null) return true;
//如果ab的值不相等则为false
if(root1.val != root2.val) return false;
//递归ab树
return test(root1.left,root2.left) && test(root1.right,root2.right);
}
public boolean HasSubtree(TreeNode root1,TreeNode root2) {
//b树为空则false
if(root2 == null) return false;
//如过a树为空,b树不为空则是fasle
if(root1 == null && root2 != null) return false;
//如过a树不为空b树为空,或者a,b树都为空则是true
if(root1 == null || root2 == null) return true;
//判断除当前节点的子节点是否一样
boolean falg1 = test(root1,root2);
//把root1的左和root2比较
boolean falg2 = HasSubtree(root1.left,root2);
//把root1的右和root2比较
boolean falg3 = HasSubtree(root1.right,root2);
//只要有一个成立既是有子节点
return falg1 || falg2 || falg3 ;
}
}