输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
直接递归,
递归结束条件:如果root2为空,返回true(提前判断了root2一开始就为空的情况),那么在root2不为空的情况下,root1为空,说明这里肯定不对,返回false;
主要逻辑判断:如果root1.val==root2.val,那么此时有两种情况,包含这个root节点是子结构的一部分,所以我们进入
如果不包含这个节点,我们就不能取这个root,所以进入
1 | helper(root1.left,root2.left)&&helper(root1.right,root2.right) |
1 | helper(root1.left,root2)||helper(root1.right,root2) |
回到开始,如果root1.val!=root2.val,也就是进入那个else判断,那么我们就直接返回这个结果就可以了。
1 | helper(root1.left,root2)||helper(root1.right,root2) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | /** 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 (root2== null ) return false ; return helper(root1,root2); } public boolean helper(TreeNode root1,TreeNode root2) { if (root2== null ) return true ; if (root1== null ) return false ; if (root1.val==root2.val) return (helper(root1.left,root2.left)&&helper(root1.right,root2.right))||(helper(root1.left,root2)||helper(root1.right,root2)); else return helper(root1.left,root2)||helper(root1.right,root2); } } |