二叉树的堂兄弟节点
难度:
标签:
题目描述
在二叉树中,根节点位于深度 0
处,每个深度为 k
的节点的子节点位于深度 k+1
处。
如果二叉树的两个节点深度相同,但 父节点不同 ,则它们是一对堂兄弟节点。
我们给出了具有唯一值的二叉树的根节点 root
,以及树中两个不同节点的值 x
和 y
。
只有与值 x
和 y
对应的节点是堂兄弟节点时,才返回 true
。否则,返回 false
。
示例 1:
输入:root = [1,2,3,4], x = 4, y = 3 输出:false
示例 2:
输入:root = [1,2,3,null,4,null,5], x = 5, y = 4 输出:true
示例 3:
输入:root = [1,2,3,null,4], x = 2, y = 3 输出:false
提示:
- 二叉树的节点数介于
2
到100
之间。 - 每个节点的值都是唯一的、范围为
1
到100
的整数。
代码结果
运行时间: 14 ms, 内存: 16.1 MB
/*
* 思路:
* 1. 通过DFS遍历树并使用stream API来记录每个节点的深度和父节点。
* 2. 使用递归函数来更新深度和父节点。
* 3. 检查两个节点的深度是否相同且父节点不同。
*/
import java.util.*;
import java.util.stream.*;
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) { val = x; }
}
public class Solution {
public boolean isCousins(TreeNode root, int x, int y) {
Map<Integer, Integer> depth = new HashMap<>();
Map<Integer, TreeNode> parent = new HashMap<>();
dfs(root, null, depth, parent, 0);
return depth.get(x) == depth.get(y) && parent.get(x) != parent.get(y);
}
private void dfs(TreeNode node, TreeNode par, Map<Integer, Integer> depth, Map<Integer, TreeNode> parent, int d) {
if (node == null) return;
depth.put(node.val, d);
parent.put(node.val, par);
dfs(node.left, node, depth, parent, d + 1);
dfs(node.right, node, depth, parent, d + 1);
}
}
解释
方法:
该题解使用了深度优先搜索(DFS)来查找二叉树中的两个节点x和y。通过递归地遍历整个树,它记录下每个节点的父节点和深度。一旦找到与x或y值匹配的节点,它将记录该节点的父节点和深度。最终,如果x和y的深度相同但父节点不同,说明它们是堂兄弟节点,返回true;否则返回false。
时间复杂度:
O(n)
空间复杂度:
O(n)
代码细节讲解
🦆
在DFS函数中,你是如何确保一旦找到x和y节点后停止进一步的搜索?
▷🦆
考虑到x和y的值是唯一的,如果在递归过程中早期就找到了x和y,是否还有必要遍历整棵树?
▷🦆
题解中使用了`nonlocal`关键字,这主要是为了解决什么问题?
▷🦆
在递归DFS中,为什么没有使用返回值来直接传递找到的节点信息,而是选择更新外部变量?
▷