echo

任生命穿梭 时间的角落

0%

相同的树

100. 相同的树

给定两个二叉树,编写一个函数来检验它们是否相同。

如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。

示例 1:

1
2
3
4
5
6
7
输入:       1         1
/ \ / \
2 3 2 3

[1,2,3], [1,2,3]

输出: true

示例 2:

1
2
3
4
5
6
7
输入:      1          1
/ \
2 2

[1,2], [1,null,2]

输出: false

示例 3:

1
2
3
4
5
6
7
输入:       1         1
/ \ / \
2 1 1 2

[1,2,1], [1,1,2]

输出: false

方法一:DFS

对于两棵树 root1,root2,如果 root1 和 root2 都为空,则返回 true;如果 root1 和 root2 中有一个为空,另一个不为空,则返回false。如果都不为空且它们的值相等,则递归判断左右子树。

1
2
3
4
5
6
7
8
9
10
11
12
13
class Solution {
public boolean isSameTree(TreeNode p, TreeNode q) {
if(p == null && q == null){
return true;
}

if(p == null || q == null){
return false;
}

return p.val == q.val && isSameTree(p.left, q.left) && isSameTree(p.right, q.right);
}
}

时间复杂度O(min(m, n)),m,n为两棵树的节点数。空间复杂度O(min(m, n))。

方法二:BFS

我们使用两个队列来存储二叉树的层次遍历。判断这个队列中的结点值是否相同即可。

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
32
33
class Solution {
public boolean isSameTree(TreeNode p, TreeNode q) {
if(p == null && q == null){
return true;
}

if(p == null || q == null){
return false;
}

Queue<TreeNode> q1 = new LinkedList<>();
Queue<TreeNode> q2 = new LinkedList<>();
q1.offer(p);
q2.offer(q);

while(!q1.isEmpty() && !q2.isEmpty()){
TreeNode n1 = q1.poll(), n2 = q2.poll();
if(n1.val != n2.val){
return false;
}

if( (n1.left == null ^ n2.left == null) || (n1.right == null ^ n2.right == null) ){
return false;
}

if(n1.left != null) q1.offer(n1.left);
if(n1.right != null) q1.offer(n1.right);
if(n2.left != null) q2.offer(n2.left);
if(n2.right != null) q2.offer(n2.right);
}
return true;
}
}

时间复杂度O(min(m, n)),m,n为两棵树的节点数。空间复杂度O(min(m, n))。