Leetcode 993二叉树的堂兄弟节点
题目定义:
在二叉树中,根节点位于深度 0 处,每个深度为 k 的节点的子节点位于深度 k+1 处。
如果二叉树的两个节点深度相同,但父节点不同,则它们是一对堂兄弟节点。
我们给出了具有唯一值的二叉树的根节点 root,以及树中两个不同节点的值 x 和 y。
只有与值 x 和 y 对应的节点是堂兄弟节点时,才返回 true。否则,返回 false。
示例 1:
1
/ \
2 3
/
4
输入:root = [1,2,3,4], x = 4, y = 3
输出:false
示例 2:
1
/ \
2 3
\ \
4 5
输入:root = [1,2,3,null,4,null,5], x = 5, y = 4
输出:true
示例 3:
1
/ \
2 3
\
4
输入:root = [1,2,3,null,4], x = 2, y = 3
输出:false
提示:
二叉树的节点数介于 2 到 100 之间。
每个节点的值都是唯一的、范围为 1 到 100 的整数。
递归方式:
class Solution {
public boolean isCousins(TreeNode root, int x, int y) {
if(root == null)
return true;
Pair<TreeNode,Integer> pairX = dfs(root,null,x,0);
Pair<TreeNode,Integer> pairY = dfs(root,null,y,0);
return pairX.getKey() != pairY.getKey()
&& pairX.getValue() == pairY.getValue();
}
/*
* 思路:定义一个<key,Value>保存查找出来的值,
* key保存的是当前节点的父结点,value保存的是当前节点的深度
*/
private Pair<TreeNode,Integer> dfs(TreeNode root,
TreeNode parent,
int value,
int level){
if(root == null)
return null;
if(root.val == value)
return new Pair<>(parent,level);
Pair<TreeNode, Integer> pair =
dfs(root.left, root, value, level + 1);
if(pair == null)
pair = dfs(root.right, root, value, level + 1);
return pair;
}
}
迭代方式:
class Solution {
public boolean isCousins(TreeNode root, int x, int y) {
if(root == null)
return true;
Queue<Pair<TreeNode,TreeNode>> queue = new LinkedList<>();
Pair<TreeNode,Integer> p = null;
int level = 0;
queue.offer(new Pair<>(null,root));
while(queue.size() > 0){
int size = queue.size();
for(int i = 0; i < size; ++i){
Pair<TreeNode,TreeNode> pair = queue.poll();
if(pair.getValue().val == x || pair.getValue().val == y){
if(p != null)
return p.getKey() != pair.getKey()
&& level == p.getValue();
else
p = new Pair<>(pair.getKey(),level);
}
if(pair.getValue().left != null)
queue.offer(new Pair<>(pair.getValue(),pair.getValue().left));
if(pair.getValue().right != null)
queue.offer(new Pair<>(pair.getValue(),pair.getValue().right));
}
level ++;
}
return false;
}
}
另一种递归方式:
class Solution {
private Map<Integer,Integer> depth = new HashMap<>();
private Map<Integer,TreeNode> parent = new HashMap<>();
public boolean isCousins(TreeNode root, int x, int y) {
if(root == null)
return true;
dfs(root,null);
return depth.get(x) == depth.get(y) && parent.get(x) != parent.get(y);
}
private void dfs(TreeNode root,TreeNode par){
if(root != null){
depth.put(root.val,par == null ? 0 : depth.get(par.val) + 1);
parent.put(root.val,par);
dfs(root.left,root);
dfs(root.right,root);
}
}
}
参考:
https://leetcode-cn.com/problems/cousins-in-binary-tree/submissions/