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/

原文地址:https://www.cnblogs.com/CodingXu-jie/p/14142904.html