首页 > 其他分享 >力扣---1123. 最深叶节点的最近公共祖先

力扣---1123. 最深叶节点的最近公共祖先

时间:2023-09-06 22:03:30浏览次数:45  
标签:node 力扣 TreeNode res 1123 --- 深度 return 节点

给你一个有根节点 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 ,最近公共祖先是它自己。

 

提示:

  • 树中的节点数将在 [1, 1000] 的范围内。
  • 0 <= Node.val <= 1000
  • 每个节点的值都是 独一无二 的。

 

注意:本题与力扣 865 重复:https://leetcode-cn.com/problems/smallest-subtree-with-all-the-deepest-nodes/


 

一开始看见找叶子节点,想到的是广度优先搜索,可以很方便地找到最深的叶子节点。然后需要找到公共祖先,于是想到了回溯。

先找到最深的叶子节点,然后层层往上回溯。当回溯时返回的 Set 的长度为 1 时,意味着此时就是答案。接下来就直接返回它即可。

class Solution {
    public TreeNode lcaDeepestLeaves(TreeNode root) {
        Set<TreeNode> set = new HashSet<>();
        set.add(root);
        Set<TreeNode> res = getRes(set);
        for (TreeNode node : res) {
            return node;
        }
        return null;
    }

    private Set<TreeNode> getRes(Set<TreeNode> set) {
        Set<TreeNode> leafSet = new HashSet<>();
        for (TreeNode node : set) {
            if (node.left != null) {
                leafSet.add(node.left);
            }
            if (node.right != null) {
                leafSet.add(node.right);
            }
        }
        if (leafSet.isEmpty()) {
            return new HashSet<>(set);
        }
        Set<TreeNode> res = getRes(leafSet);
        if (res.size() == 1) {
            return res;
        } else {
            Set<TreeNode> resSet = new HashSet<>();
            for (TreeNode node : set) {
                if (res.contains(node.left) || res.contains(node.right)) {
                    resSet.add(node);
                }
            }
            return resSet;
        }
    }
}

 优化:

可以用深度优先搜索。

递归,通过递来获取最深路径,通过归来判断是否是答案。

class Solution {
    private TreeNode res;
    private int maxDepth = -1; // 全局最大深度

    public TreeNode lcaDeepestLeaves(TreeNode root) {
        dfs(root, 0);
        return res;
    }

    private int dfs(TreeNode node, int depth) {
        if (node == null) {
            maxDepth = Math.max(depth, maxDepth);
            return depth;
        }
        // 左子树的最大深度
        int leftDepth = dfs(node.left, depth + 1);
        // 右子树的最大深度
        int rightDepth = dfs(node.right, depth + 1);
        // 如果左子树的最大深度等于右子树的最大深度并且左子树的深度等于当前的最大深度,则说明当前节点是当前已经走过的路径中的答案。
        // 可以想到,如果左子树深度和右子树深度不相等的话,当前节点绝对不可能是答案。
        // 如果之后最大深度更新了,当前答案也会随之更新。
        if (leftDepth == rightDepth && leftDepth == maxDepth) {
            res = node;
        }
        return Math.max(leftDepth, rightDepth);
    }
}

 

标签:node,力扣,TreeNode,res,1123,---,深度,return,节点
From: https://www.cnblogs.com/allWu/p/17683475.html

相关文章

  • Django-SQL Injection Vulnerability (CVE-2019-14234)
    复现环境:Vulhub环境启动后,访问http://192.168.80.141:8000即可看到Django默认首页漏洞复现首先登陆后台http://192.168.80.141:8000/admin/,用户名密码为admin、a123123123。登陆后台后,进入模型Collection的管理页面http://192.168.80.141:8000/admin/vuln/collection/:然后......
  • drf-认证、权限、频率
    一、认证组件1.认证组件的作用一些接口,想要限制登录之后才能访问,没登录不能访问做登录认证,限制如果没有登录,不允许访问该接口2.认证类的使用:1.在auth.py中写一个类,去继承BaseAuthentication2.在这个类中重写:authenticate方法3.在authenticate完成......
  • 中医学习记录6-生僻字
    中医学习记录6-生僻字癥:zheng。“症”的繁体字。腹中结块的病。瘕:jia。中医病名。本指妇女腹中结块的病;泛指人腹中结块的病。疥:jie。疥疮,由疥虫引起的传染性皮肤病,皮肤上出现疹子,刺痒难耐。疮:chuang。1.外伤;伤口。2.皮肤或黏膜红肿、溃烂的疾病。瘙:sao。疥疮。痂:jia。疮口或......
  • 数值计算-习题2.2
    1#-*-coding:utf-8-*-2"""3CreatedonWedSep619:35:03202345@author:shixi6"""7#2.2(1)8x0,x1,x2=0.46,0.47,0.489y0,y1,y2=0.4846555,0.4937452,0.50274981011defp2(x):12returny0*(x-......
  • 2023-09-06
    1.一天都在做售后工作,帮客户远程调试设备,修改文件系统配置。2.C#爬虫项目,按网址要求爬取产品价格、型号、内存等参数信息,分类导入表格。3.STM32继续调试。4.无人机项目继续。5.Genshin带一个男同事小萌新。 ......
  • 虚拟化-基础学习
    虚拟化-基础学习虚拟化HypervisorHypervisor,又称虚拟机器监视器(英语:virtualmachinemonitor,缩写为VMM),是用来管理虚拟机运行的。运行虚拟机的电脑被称为宿主机,虚拟机称为客户机,各个客户机共享虚拟化后的硬件资源。Hypervisor又分为两类:type1虚拟机管理程序Hypervisor直接运......
  • Rust-高级进阶
    Rust高级进阶生命周期进阶生命周期约束通过形如'a:'b的语法,可以说明两个生命周期的长短关系。'a:'b这种情况说明生命周期'a>='b。structDoubleRef<'a,'b:'a,T>{r:&'aT,s:&'bT}T:'a类型T必须比'a活得要久:st......
  • 剑指 Offer 57 - II. 和为s的连续正数序列
    输入一个正整数 target ,输出所有和为 target 的连续正整数序列(至少含有两个数)。序列内的数字由小到大排列,不同序列按照首个数字从小到大排列。 示例1:输入:target=9输出:[[2,3,4],[4,5]]示例2:输入:target=15输出:[[1,2,3,4,5],[4,5,6],[7,8]]classSolution{publici......
  • openGauss学习笔记-62 openGauss 数据库管理-两地三中心跨Region容灾
    openGauss学习笔记-62openGauss数据库管理-两地三中心跨Region容灾要实现跨Region容灾,需要部署两套数据库实例,一套主数据库实例,一套灾备数据库实例。主数据库实例和灾备数据库实例一般部署在相距较远的两个不同城市。数据库实例之间借助存储介质或者不借助存储介质直接实现数据......
  • 米联客-S02(Artix-7-XC7A35T/100T)开发平台硬件手册
    1产品概述    MLK-S02(XC7A35T/100T)是米联客S系列开发平台的一款高性价比开发板。其核心模块集成电源管理:1V核心电源,最大输出8A。其开发平台为一体开发板,将主芯片直接焊接于开发板上,其开发板设计尺寸紧凑、资源丰富。其应用领域包含高速通信、机器视觉、伺服系统、视频采集......