572. 另一个树的子树(简单)

题目

给定两个非空二叉树 s 和 t,检验 s 中是否包含和 t 具有相同结构和节点值的子树。s 的一个子树包括 s 的一个节点和这个节点的所有子孙。s 也可以看做它自身的一棵子树。

示例1:

1
2
3
4
5
6
7
8
9
10
11
12
13
给定的树 s:

3
/ \
4 5
/ \
1 2
给定的树 t:

4
/ \
1 2
返回 true,因为 t 与 s 的一个子树拥有相同的结构和节点值。

示例 2:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
给定的树 s:

3
/ \
4 5
/ \
1 2
/
0
给定的树 t:

4
/ \
1 2
返回 false。

思路

DFS 枚举 ss 中的每一个节点,判断这个点的子树是否和 tt 相等。如何判断一个节点的子树是否和 tt 相等呢,我们又需要做一次 DFS 来检查,即让两个指针一开始先指向该节点和 tt 的根,然后「同步移动」两根指针来「同步遍历」这两棵树,判断对应位置是否相等。

关键点

  • 分空二叉树

复杂度

  • 时间复杂度:O(∣s∣×∣t∣)
  • 空间复杂度:O(max{ds,dt})

代码

递归法

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
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func isSubtree(s *TreeNode, t *TreeNode) bool {
if s == nil {
return false
}
return isEqual(s, t) || isSubtree(s.Left, t) || isSubtree(s.Right, t)
}

func isEqual(s, t *TreeNode) bool {
if s == nil && t == nil {
return true
}
if s == nil || t == nil {
return false
}
if s.Val != t.Val{
return false
}
return isEqual(s.Left, t.Left) && isEqual(s.Right, t.Right)
}