相同的树
难度:
标签:
题目描述
给你两棵二叉树的根节点 p
和 q
,编写一个函数来检验这两棵树是否相同。
如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。
示例 1:
输入:p = [1,2,3], q = [1,2,3] 输出:true
示例 2:
输入:p = [1,2], q = [1,null,2] 输出:false
示例 3:
输入:p = [1,2,1], q = [1,1,2] 输出:false
提示:
- 两棵树上的节点数目都在范围
[0, 100]
内 -104 <= Node.val <= 104
代码结果
运行时间: 32 ms, 内存: 15 MB
/*
* 题目思路:
* 1. 使用Stream来处理和比较树节点的值和结构。
* 2. 如果两棵树都是空树,则它们相同。
* 3. 如果只有一棵树是空树,另一棵树不是,则它们不同。
* 4. 如果两棵树的根节点值不同,则它们不同。
* 5. 递归比较左右子树,所有条件都满足则它们相同。
*/
import java.util.stream.Stream;
public class Solution {
public boolean isSameTree(TreeNode p, TreeNode q) {
// 如果两棵树都是空树
if (p == null && q == null) {
return true;
}
// 如果其中一棵树为空
if (p == null || q == null) {
return false;
}
// 如果根节点值不同
if (p.val != q.val) {
return false;
}
// 递归比较左右子树
return Stream.of(p.left, q.left).allMatch(node -> isSameTree(p.left, q.left))
&& Stream.of(p.right, q.right).allMatch(node -> isSameTree(p.right, q.right));
}
}
解释
方法:
这个题解采用递归的方式来判断两棵二叉树是否相同。首先判断当前两个节点 p 和 q 是否同时为 None,如果是则说明遍历到了叶子节点且两棵树一直相同,返回 True。如果当前两个节点都不为 None 且节点值相同,则递归判断它们的左右子树是否相同。只要有一个节点为 None 或者节点值不同,则说明两棵树不同,返回 False。
时间复杂度:
O(min(m,n))
空间复杂度:
O(min(h1,h2))
代码细节讲解
🦆
在递归判断两棵树是否相同时,为何需要首先检查两个节点是否都为 None?是否可以只检查一个节点?
▷🦆
递归判断两棵树是否相同时,为什么要同时检查节点值和节点的左右子树?不能只比较节点值吗?
▷🦆
在实际的编程实践中,如果遇到具有大量节点的大树,递归方法可能会导致栈溢出。有什么策略可以避免这个问题?
▷