力扣-572-子树

题目:
572. Subtree of Another Tree(easy)

解题思路:
依旧是递归和深度优先遍历的思维。
类似leetcode 437这个题的解题思路,写一个辅助函数专门处理从root出来的递归过程,然后root.left和root.right再更新root指向的子孙结点。
代码更为清晰。

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Java:
public boolean isSubtree(TreeNode s,TreeNode t){
if(s == null) return false;
/*虽说题目说这两颗树都是非空的,但这步不能省,因为在递归时往下会出现指向空结点的情况,要及时返回回溯回去。*/

return isSubtreeWithRoot(s,t) || isSubtree(s.left,t) || isSubtree(s.right,t);
//只要其中有一种情况出现,就判断有子树这种结构

}

private boolean isSubtreeWithRoot(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;
//这里一定要判断不等返回false,不能判断相等返回true
//因为只有第一种情况返回我们想要的结果true
//剩下的情况都不是想要的true结果
//判不等返回false还可以快速排除一些不对的情况

return isSubtreeWithRoot(s.left,t.left) && isSubtreeWithRoot(s.right,t.right);
/* 此处用&&是因为要满足 s的结点和结点的所有子孙都是 t的相同结构 */

}