判断 b是否为a的子树结构
a 为空 或者 b 为空,就肯定不是
否则的话 需要判断 b和a都是根调用辅助函数, ab是不是相同结构 b是不是a的左子树 b是不是a右子树
辅助函数 以a,b为根的树是否相同。
递归终止 当 a,b值都相同 的时候继续 如果递归到b == null 说明到头了 就返回true;
如果 a b的值不想等, 或者传入时 a为空 b不为空 他俩就不相同 返回 FALSE
然后分别对左右子树递归判断
为什么这里不能是
return IsContain(root1,root2) || HasSubtree(root1.left,root2) || HasSubtree(root1.right,root2);
都改成IsContain 因为这样只对根节点 和根节点的左右子树判断了,没有进行更深入的递归判断。所以需要 HasSubtree进行递归
return IsContain(root1,root2) || IsContain(root1.left,root2) || IsContain(root1.right,root2);
/** public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; } } */ public class Solution { public boolean HasSubtree(TreeNode root1,TreeNode root2) { if(root1 == null || root2 == null) return false; return IsContain(root1,root2) || HasSubtree(root1.left,root2) || HasSubtree(root1.right,root2); } public boolean IsContain(TreeNode root1,TreeNode root2){ if(root2 == null) return true; if(root1 == null || root1.val != root2.val) return false; return IsContain(root1.left,root2.left) && IsContain(root1.right,root2.right); } }