Given two non-empty binary trees s and t, check whether tree t has exactly the same structure and node values with a subtree of s. A subtree of s is a tree consists of a node in s and all of this node's descendants. The tree s could also be considered as a subtree of itself.
Example 1:
Given tree s:
3
/
4 5
/
1 2
Given tree t:
4
/
1 2
Return true, because t has the same structure and node values with a subtree of s.
Example 2:
Given tree s:
3
/
4 5
/
1 2
/
0
Given tree t:
4
/
1 2
Return false.
怎么顾及到别的根节点啊?
return isSubtree(s.left, t) || isSubtree(s.right, t);
既然是子树就只需要子树跟另一棵树一样就行了,反正只是递归中的一部分
这tm也太抽象了吧!
好吧,其实isSameTree只是大的递归中的一个小递归罢了。递归是可以嵌套的。
主函数:isSameTree(s.left, t) && isSameTree(s.right, t);
是这样吧?虽然我也不懂为啥。是的,而且要用到嵌套递归
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val = val; } * TreeNode(int val, TreeNode left, TreeNode right) { * this.val = val; * this.left = left; * this.right = right; * } * } */ class Solution { public boolean isSubtree(TreeNode s, TreeNode t) { //特殊情况,还是得有的 if (s == null) return false; //直接是相同的树 if(isSameTree(s, t)) return true; //子树的情况 return isSubtree(s.left, t) || isSubtree(s.right, t); } public boolean isSameTree(TreeNode s, TreeNode t) { //都是空 if (s == null && t == null) return true; //一方为空 if (s == null || t == null) return false; //都不空,值不同 if (s.val != t.val) return false; //都不空,值不同 return isSameTree(s.left, t.left) && isSameTree(s.right, t.right); } }