• 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/

  • 相关阅读:
    作业要求 20201022-1 每周例行报告
    作业要求 20201015-3 每周例行报告
    20201008-1 每周例行报告
    20200924-1 每周例行报告
    总结
    20201126-1 每周例行报告
    20201120-1 每周例行报告
    20201112-1 每周例行报告
    20201105-1 每周例行报告
    20201029-1 每周例行报告
  • 原文地址:https://www.cnblogs.com/CodingXu-jie/p/14142904.html
Copyright © 2020-2023  润新知