二叉树的堂兄弟节点
-java(DFS)
题目如下:
求两个节点是否为堂兄弟节点,只需要两个节点的深度(即depth)相等并且父节点不是同一个即可(为了方便,只需要父节点的值不相等)
也就是说满足堂兄弟节点的条件就是:
- 两个节点的深度相等
- 父节点的值不相等
主要思路:
前序遍历整棵树,维护每个节点的深度和父节点,将x、y的深度和父节点的值保存起来。树的遍历完成后,判断值为x、y的节点是否为堂兄弟节点即可。
代码如下:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
private int xDepth,yDepth;
private int xParentVal,yParentVal;
public boolean isCousins(TreeNode root, int x, int y) {
recursion(root,0,x,y);
return xDepth == yDepth && xParentVal != yParentVal;
}
public void recursion(TreeNode root,int depth, int x, int y){
int val = root.val;
if( val == x ){
xDepth = depth;
}else if( val == y ){
yDepth = depth;
}
if( root.left != null ){
int leftVal = root.left.val;
if( leftVal == x ){
xParentVal = val;
}else if( leftVal == y ){
yParentVal = val;
}
recursion(root.left,depth + 1, x, y);
}
if( root.right != null ){
int rightVal = root.right.val;
if( rightVal == x ){
xParentVal = val;
}else if( rightVal == y ){
yParentVal = val;
}
recursion(root.right,depth + 1, x, y);
}
}
}