在二叉树中,根节点位于深度 0 处,每个深度为 k 的节点的子节点位于深度 k+1 处。
如果二叉树的两个节点深度相同,但 父节点不同 ,则它们是一对堂兄弟节点。
我们给出了具有唯一值的二叉树的根节点 root ,以及树中两个不同节点的值 x 和 y 。
只有与值 x 和 y 对应的节点是堂兄弟节点时,才返回 true 。否则,返回 false。
示例 1:
输入:root = [1,2,3,4], x = 4, y = 3
1
/ \
2 3
/
4
输出:false
示例 2:
输入:root = [1,2,3,null,4,null,5], x = 5, y = 4
1
/ \
2 3
\ \
4 5
输出:true
示例 3:
输入:root = [1,2,3,null,4], x = 2, y = 3
1
/ \
2 3
\
4
输出:false
根据题意,应当先分别计算出两个节点的深度以及父节点,若深度不同,则不是堂兄弟节点;若深度相同,则判断父节点是否相同,若相同,则不是堂兄弟节点,反之是堂兄弟节点。
熟悉的二叉树的深度算法:
public int treeDept(TreeNode root) {
if(root == null) {
return 0;
}
return Math.max(treeDept(root.left), treeDept(root.right)) + 1;
}
从二叉树的深度算法中可以推导出计算某个节点的深度算法:
int target;
int targetDept = -1;
public int targetNodeDept(TreeNode root, int target) {
this.target = target;
nodeDept(root, 0);
return targetDept;
}
public void nodeDept(TreeNode node, int dept) {
if (node == null) {
return;
}
if (node.val == target) {
targetDept = dept + 1;
}
nodeDept1(node.left, dept + 1);
nodeDept1(node.right, dept + 1);
}
第一版算法,先得到两个目标节点的深度:
int xNodeVal;
int yNodeVal;
int xNodeDept;
int yNodeDept;
public boolean isCousins(TreeNode root, int x, int y) {
this.xNodeVal = x;
this.yNodeVal = y;
nodeDept(root, 0);
}
private void nodeDept(TreeNode root, int dept) {
if (root == null) {
return;
}
if (root.val == xNodeVal) {
xNodeDept = dept;
}
if (root.val == yNodeVal) {
yNodeDept = dept;
}
dept(root.left, dept + 1);
dept(root.right, dept + 1);
}
�同理,若想得到节点的父节点,可参考节点深度算法,扩充一个父节点参数:
int xNodeVal;
int yNodeVal;
int xNodeDept;
int yNodeDept;
TreeNode xNodeParent;
TreeNode yNodeParent;
public boolean isCousins(TreeNode root, int x, int y) {
this.xNodeVal = x;
this.yNodeVal = y;
nodeDept(root, 0, null);
}
private void nodeDept(TreeNode root, int dept, TreeNode parentNode) {
if (root == null) {
return;
}
if (root.val == xNodeVal) {
xNodeDept = dept;
xNodeParent = parentNode;
}
if (root.val == yNodeVal) {
yNodeDept = dept;
yNodeParent = parentNode;
}
dept(root.left, dept + 1, root);
dept(root.right, dept + 1, root);
}
完整的算法:
int xNodeVal;
int yNodeVal;
int xNodeDept;
int yNodeDept;
TreeNode xNodeParent;
TreeNode yNodeParent;
public boolean isCousins(TreeNode root, int x, int y) {
this.xNodeVal = x;
this.yNodeVal = y;
nodeDept(root, 0, null);
return xNodeDept == yNodeDept && xNodeParent != yNodeParent;
}
private void nodeDept(TreeNode root, int dept, TreeNode parentNode) {
if (root == null) {
return;
}
if (root.val == xNodeVal) {
xNodeDept = dept;
xNodeParent = parentNode;
}
if (root.val == yNodeVal) {
yNodeDept = dept;
yNodeParent = parentNode;
}
dept(root.left, dept + 1, root);
dept(root.right, dept + 1, root);
}