题目地址:
https://leetcode.com/problems/same-tree/
判断两棵二叉树是否全等。全等当且仅当树根值相等,并且左右子树分别全等。分治法:
public class Solution {
public boolean isSameTree(TreeNode p, TreeNode q) {
if (p == null && q == null) {
return true;
} else if (p == null || q == null) {
return false;
}
return p.val == q.val && isSameTree(p.left, q.left) && isSameTree(p.right, q.right);
}
}
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) {
val = x;
}
}
时间复杂度
O
(
n
)
O(n)
O(n),这里
n
n
n指的是两棵树规模较小者的规模。空间复杂度
O
(
h
)
O(h)
O(h)。
时间复杂度证明:设符号
p
l
r
l
plrl
plrl表示树
p
p
p的左子树的右子树的左子树(根),其余同。时间复杂度有递推方程:
T
(
p
,
q
)
=
T
(
p
l
,
q
l
)
+
T
(
p
r
,
q
r
)
+
O
(
1
)
=
T
(
p
l
l
,
q
l
l
)
+
T
(
p
l
r
,
q
l
r
)
+
T
(
p
r
l
,
q
r
l
)
+
T
(
p
r
r
,
q
r
r
)
+
O
(
3
)
=
.
.
.
=
O
(
较
小
树
叶
子
数
)
+
O
(
分
叉
数
)
=
O
(
n
)
T(p,q)=T(pl,ql)+T(pr,qr)+O(1)\\=T(pll,qll)+T(plr,qlr)+T(prl,qrl)+T(prr,qrr)+O(3)\\=...=O(较小树叶子数)+O(分叉数)=O(n)
T(p,q)=T(pl,ql)+T(pr,qr)+O(1)=T(pll,qll)+T(plr,qlr)+T(prl,qrl)+T(prr,qrr)+O(3)=...=O(较小树叶子数)+O(分叉数)=O(n)之所以是较小树,是因为较小树遍历完成之后就立刻能知道两棵树是否等价了,换句话说,如果两棵树不全等,在较小规模的树遍历完的时候,就已经开始return了,不用继续遍历较大规模的那棵树了。