993. 二叉树的堂兄弟节点
/**
* 使用dfs 存储x y的深度和父亲 最后比较
*/
class Solution {
int depth1 = 0, depth2 = 0;//存两个节点的深度
TreeNode parent1 = null, parent2 = null;//存两个节点的父节点
public boolean isCousins(TreeNode root, int x, int y) {
dfs(root, null, x, y, 0);
return depth1 == depth2 && parent1 != parent2;//深度相同 父亲不同¬
}
private void dfs(TreeNode root, TreeNode parent, int x, int y, int depth) {
if (root == null) return;
if (root.val == x) {//找到x 填充x的信息
depth1 = depth;
parent1 = parent;
}
if (root.val == y) {//同上
depth2 = depth;
parent2 = parent;
}
dfs(root.left, root, x, y, depth + 1);//dfs左孩子 深度+1 然后left的父亲当然是当前root
dfs(root.right, root, x, y, depth + 1);
}
}
/**
* 查找 t 的「父节点值」&「所在深度」
* @param root 当前搜索到的节点
* @param fa root 的父节点
* @param depth 当前深度
* @param t 搜索目标值
* @return [fa.val, depth]
*/
int[] dfs(TreeNode root, TreeNode fa, int depth, int t);
//上述方法签名来自@宫水三叶,需要学习的是这种写代码的规范或者说良好习惯。
class Solution {
public boolean isCousins(TreeNode root, int x, int y) {
int[] xi = dfs(root, null, 0, x);
int[] yi = dfs(root, null, 0, y);
return xi[1] == yi[1] && xi[0] != yi[0];
}
int[] dfs(TreeNode root, TreeNode fa, int depth, int t) {
if (root == null) return new int[]{-1, -1}; // 使用 -1 代表为搜索不到 t
if (root.val == t) {
return new int[]{fa != null ? fa.val : 1, depth}; // 使用 1 代表搜索值 t 为 root
}
int[] l = dfs(root.left, root, depth + 1, t);
if (l[0] != -1) return l;
return dfs(root.right, root, depth + 1, t);
}
}