LeetCode100-相同的树

题目链接

英文链接:https://leetcode.com/problems/same-tree/

中文链接:https://leetcode-cn.com/problems/same-tree/

题目详述

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

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

示例 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

题目详解

判断两个二叉树相同的三个关键点:

  • 两个结点当前的值是否相同
  • 两个结点的左子树是否相同。
  • 两个结点的右子树是否相同。

注意整个过程中 null 的判断。

递归版本:

1
2
3
4
5
6
7
8
9
10
11
12
public class LeetCode_00100 {

public boolean isSameTree(TreeNode p, TreeNode q) {
if (p == q) { // 包含 p、q 均为 null 和 p、q 指向同一个对象
return true;
}
if (p == null || q == null) {
return false;
}
return p.val == q.val && isSameTree(p.left, q.left) && isSameTree(p.right, q.right);
}
}

迭代版本:

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
public class LeetCode_00100 {

// 迭代版本
public boolean isSameTree(TreeNode p, TreeNode q) {
if (p == null && q == null) {
return true;
}
if (p == null || q == null) {
return false;
}
LinkedList<TreeNode> stack = new LinkedList<>();
stack.push(p);
stack.push(q);
while (!stack.isEmpty()) {
p = stack.pop();
q = stack.pop();
if (p == null && q == null) {
continue;
}
if (p == null || q == null) {
return false;
}
if (p.val != q.val) {
return false;
}
stack.push(p.left);
stack.push(q.left);
stack.push(p.right);
stack.push(q.right);
}
return true;
}
}