993. 二叉树的堂兄弟节点
在二叉树中,根节点位于深度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
示例 2:
输入:root = [1,2,3,null,4], x = 2, y = 3
输出:false
题目分析
解题思路:
使用全局变量 depth 及 father 保存第一个搜索到的节点深度和父节点,在搜索到第二个节点时判断深度和父节点即可得出结果
回溯法有“通用解题法”之称,用它可以系统地搜索问题的所有解。回溯法是一个既带有系统性又带有跳跃性的搜索算法。
class Solution {
private int depth;
private TreeNode father;
public boolean isCousins(TreeNode root, int x, int y) {
return dfs(root, null, 1, x, y);
}
private boolean dfs(TreeNode node, TreeNode fa, int d, int x, int y) {
if (node == null) {
return false;
}
if (node.val == x || node.val == y) {
// 之前已找到 x y 其中一个
if (depth > 0) {
return depth == d && father != fa;
}
// 之前没找到,记录信息
depth = d;
father = fa;
}
return dfs(node.left, node, d + 1, x, y) || dfs(node.right, node, d + 1, x, y);
}
}