• leecode1123. 最深叶节点的最近公共祖先


    给你一个有根节点 root 的二叉树,返回它 最深的叶节点的最近公共祖先 。

    回想一下:

    叶节点 是二叉树中没有子节点的节点
    树的根节点的 深度 为 0,如果某一节点的深度为 d,那它的子节点的深度就是 d+1
    如果我们假定 A 是一组节点 S 的 最近公共祖先,S 中的每个节点都在以 A 为根节点的子树中,且 A 的深度达到此条件下可能的最大值。
     

    示例 1:


    输入:root = [3,5,1,6,2,0,8,null,null,7,4]
    输出:[2,7,4]
    解释:我们返回值为 2 的节点,在图中用黄色标记。
    在图中用蓝色标记的是树的最深的节点。
    注意,节点 6、0 和 8 也是叶节点,但是它们的深度是 2 ,而节点 7 和 4 的深度是 3 。
    示例 2:

    输入:root = [1]
    输出:[1]
    解释:根节点是树中最深的节点,它是它本身的最近公共祖先。
    示例 3:

    输入:root = [0,1,3,null,2]
    输出:[2]
    解释:树中最深的叶节点是 2 ,最近公共祖先是它自己。

    class Solution {
        public TreeNode lcaDeepestLeaves(TreeNode root) {
            if (root == null) {
                return null;
            }
            //节点队列
            Queue<TreeNode> queue = new ArrayDeque<>();
            queue.offer(root);
            //节点层级关系
            Map<TreeNode, TreeNode> map = new HashMap<>();
            map.put(root, null);
            //节点层级
            Map<TreeNode, Integer> levMap = new HashMap<>();
            levMap.put(root, 1);
            int curLev = 1;
    
            Set<TreeNode> list = new HashSet<>();
    
            while (!queue.isEmpty()) {
    
                TreeNode cur = queue.poll();
                list.add(cur);
    
                if (cur.left != null) {
                    queue.offer(cur.left);
                    map.put(cur.left, cur);
    
                    levMap.put(cur.left, curLev + 1);
                }
                if (cur.right != null) {
                    queue.offer(cur.right);
                    map.put(cur.right, cur);
    
                    levMap.put(cur.right, curLev + 1);
                }
    
                TreeNode next = queue.peek();
                if (next != null && levMap.get(next) != curLev) {
                    list.clear();
                    curLev++;
                }
            }
            //叶子节点
            return find(list, map);
        }
    
        public TreeNode find(Set<TreeNode> list, Map<TreeNode, TreeNode> map) {
            if (list.size() == 0) {
                return null;
            }
            //直到父节点只有一个
            if (list.size() == 1) {
                return list.iterator().next();
            }
    
            Set<TreeNode> r = new HashSet<>();
            for (TreeNode treeNode : list) {
                //放入父节点
                r.add(map.get(treeNode));
            }
    
            return find(r, map);
        }
    
    
    }
    
  • 相关阅读:
    3大生产基地7万口窖池同时开窖,2023洋河·双沟开窖节吸引百万人集体关注
    Swin-Transformer(2021-08)
    建筑施工员证怎么考?报名条件及报考时间是什么?
    gcc和Makefile,多文件编译器
    git安装
    elasticsearch配置
    Android mtk 系统应用改为可卸载,恢复出厂可恢复
    Java基础之《netty(2)—IO模型、BIO介绍、NIO介绍》
    Delphi 高精度计时
    追剧系列 《计算机程序的构造和解释》
  • 原文地址:https://blog.csdn.net/liuhongtaowxp1/article/details/125515635