二叉树题目:具有所有最深结点的最小子树

news2024/9/27 7:17:36

文章目录

  • 题目
    • 标题和出处
    • 难度
    • 题目描述
      • 要求
      • 示例
      • 数据范围
  • 解法一
    • 思路和算法
    • 代码
    • 复杂度分析
  • 解法二
    • 思路和算法
    • 代码
    • 复杂度分析

题目

标题和出处

标题:具有所有最深结点的最小子树

出处:865. 具有所有最深结点的最小子树

难度

5 级

题目描述

要求

给定二叉树的根结点 root \texttt{root} root,每个结点的深度是该结点到根的最短距离

返回包含原始树中所有最深结点的最小子树。

如果一个结点在整个树的所有结点中具有最大的深度,则该结点是最深的

一个结点的子树是该结点加上它的所有后代的集合。

示例

示例 1:

示例 1

输入: root   =   [3,5,1,6,2,0,8,null,null,7,4] \texttt{root = [3,5,1,6,2,0,8,null,null,7,4]} root = [3,5,1,6,2,0,8,null,null,7,4]
输出: [2,7,4] \texttt{[2,7,4]} [2,7,4]
解释:
我们返回值为 2 \texttt{2} 2 的结点,在图中用黄色标记。
在图中用蓝色标记的是树的最深的结点。
注意,结点 5 \texttt{5} 5 3 \texttt{3} 3 2 \texttt{2} 2 包含树中最深的结点,但结点 2 \texttt{2} 2 的子树最小,因此我们返回它。

示例 2:

输入: root   =   [1] \texttt{root = [1]} root = [1]
输出: [1] \texttt{[1]} [1]
解释:根结点是树中最深的结点。

示例 3:

输入: root   =   [0,1,3,null,2] \texttt{root = [0,1,3,null,2]} root = [0,1,3,null,2]
输出: [2] \texttt{[2]} [2]
解释:树中最深的结点为 2 \texttt{2} 2,有效子树为结点 2 \texttt{2} 2 1 \texttt{1} 1 0 \texttt{0} 0 的子树,但结点 2 \texttt{2} 2 的子树最小。

数据范围

  • 树中结点数目在范围 [1,   500] \texttt{[1, 500]} [1, 500]
  • 0 ≤ Node.val ≤ 500 \texttt{0} \le \texttt{Node.val} \le \texttt{500} 0Node.val500
  • 树中的所有值各不相同

解法一

思路和算法

由于所有最深结点的深度相同,因此对于包含所有最深结点的子树,每个最深结点到子树根结点的距离相同。只要定位到所有最深结点,即可找到包含所有最深结点的最小子树的根结点。

为了定位到所有最深结点,可以使用层序遍历。从根结点开始依次遍历每一层的结点,在层序遍历的过程中需要区分不同结点所在的层,确保每一轮访问的结点为同一层的全部结点。遍历每一层结点之前首先得到当前层的结点数,即可确保每一轮访问的结点为同一层的全部结点。层序遍历访问的最后一层结点即为所有最深结点。

定位到所有最深结点之后,从最深结点向根结点移动,即每次从当前结点移动到父结点。由于每个最深结点到子树根结点的距离相同,因此每个最深结点将同时移动到包含所有最深结点的最小子树的根结点。使用哈希集合存储每次移动之后的结点集合,每次移动之后,结点数量一定不变或减少,当只剩下一个结点时,该结点即为包含所有最深结点的最小子树的根结点。

代码

class Solution {
    public TreeNode subtreeWithAllDeepest(TreeNode root) {
        Map<TreeNode, TreeNode> parentMap = new HashMap<TreeNode, TreeNode>();
        List<TreeNode> deepest = new ArrayList<TreeNode>();
        Queue<TreeNode> queue = new ArrayDeque<TreeNode>();
        queue.offer(root);
        while (!queue.isEmpty()) {
            deepest.clear();
            int size = queue.size();
            for (int i = 0; i < size; i++) {
                TreeNode node = queue.poll();
                deepest.add(node);
                TreeNode left = node.left, right = node.right;
                if (left != null) {
                    parentMap.put(left, node);
                    queue.offer(left);
                }
                if (right != null) {
                    parentMap.put(right, node);
                    queue.offer(right);
                }
            }
        }
        Set<TreeNode> nodes = new HashSet<TreeNode>(deepest);
        while (nodes.size() > 1) {
            Set<TreeNode> parents = new HashSet<TreeNode>();
            for (TreeNode node : nodes) {
                parents.add(parentMap.get(node));
            }
            nodes = parents;
        }
        return nodes.iterator().next();
    }
}

复杂度分析

  • 时间复杂度: O ( n ) O(n) O(n),其中 n n n 是二叉树的结点数。层序遍历访问每个结点一次,需要 O ( n ) O(n) O(n) 的时间,从所有最深结点移动到包含所有最深结点的最小子树的根结点的时间不超过 O ( n ) O(n) O(n),因此总时间复杂度是 O ( n ) O(n) O(n)

  • 空间复杂度: O ( n ) O(n) O(n),其中 n n n 是二叉树的结点数。空间复杂度主要是队列空间和哈希集合,队列内元素个数不超过 n n n,哈希集合内元素个数不超过 n n n

解法二

思路和算法

对于二叉树中的每个结点,考虑其左子树和右子树的深度。如果左子树和右子树的深度相同,则左子树和右子树中都有最深结点,当前结点就是包含所有最深结点的最小子树的根结点;如果左子树和右子树的深度不同,则所有最深结点一定在深度较大的子树中,需要在深度较大的子树中寻找包含所有最深结点的最小子树的根结点。因此,寻找包含所有最深结点的最小子树的根结点,等价于寻找左子树和右子树的深度相同的结点,以下将该结点称为「目标结点」。

从根结点开始深度优先搜索,计算每个子树的深度,并寻找目标结点。定义空树的深度为 0 0 0,当子树非空时,子树的深度为左子树的深度和右子树的深度中的最大值加 1 1 1

寻找目标结点的具体做法如下。

  1. 如果当前结点的左子树的深度和右子树的深度相同,则当前结点即为目标结点,当前子树的深度为左子树的深度加 1 1 1

  2. 否则,在深度较大的子树中寻找目标结点,当前子树的深度为深度较大的子树的深度加 1 1 1

上述过程是一个递归的过程,递归的终止条件是当前结点为空或者当前结点的左子树的深度和右子树的深度相同,其余情况则调用递归。

对于每个结点,首先访问其子结点寻找目标结点和计算子树高度,然后根据访问子结点的结果得到当前结点的结果。计算结果的顺序是先计算子结点的结果,后计算当前结点的结果,该顺序实质是后序遍历。由于在计算每个结点的结果时,该结点的子结点的结果已知,该结点的结果由子结点的结果决定,因此可以确保结果正确。

代码

class Solution {
    class NodeDepth {
        private TreeNode node;
        private int depth;

        public NodeDepth(TreeNode node, int depth) {
            this.node = node;
            this.depth = depth;
        }

        public TreeNode getNode() {
            return node;
        }

        public int getDepth() {
            return depth;
        }
    }

    public TreeNode subtreeWithAllDeepest(TreeNode root) {
        NodeDepth rootDepth = dfs(root);
        return rootDepth.getNode();
    }

    public NodeDepth dfs(TreeNode node) {
        if (node == null) {
            return new NodeDepth(node, 0);
        }
        NodeDepth left = dfs(node.left), right = dfs(node.right);
        TreeNode leftNode = left.getNode(), rightNode = right.getNode();
        int leftDepth = left.getDepth(), rightDepth = right.getDepth();
        if (leftDepth == rightDepth) {
            return new NodeDepth(node, leftDepth + 1);
        }
        return leftDepth > rightDepth ? new NodeDepth(leftNode, leftDepth + 1) : new NodeDepth(rightNode, rightDepth + 1);
    }
}

复杂度分析

  • 时间复杂度: O ( n ) O(n) O(n),其中 n n n 是二叉树的结点数。每个结点都被访问一次。

  • 空间复杂度: O ( n ) O(n) O(n),其中 n n n 是二叉树的结点数。空间复杂度主要是深度优先搜索的过程中创建实例的空间和递归调用的栈空间,因此空间复杂度是 O ( n ) O(n) O(n)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1242994.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

web前端开发基础------外边距折叠现象

引言 在设置样式时&#xff0c;需要遵循先整体再细节&#xff0c;先通用样式再特殊样式的顺序进行设置 一&#xff0c;什么是外边距折叠现象呢&#xff1f; 外边距折叠 定义&#xff1a; 外边距折叠是指相邻的两个或者多个外边距&#xff08;margin&#xff09;在垂直方向会合并…

分布式锁之基于mysql实现分布式锁(四)

不管是jvm锁还是mysql锁&#xff0c;为了保证线程的并发安全&#xff0c;都提供了悲观独占排他锁。所以独占排他也是分布式锁的基本要求。 可以利用唯一键索引不能重复插入的特点实现。设计表如下&#xff1a; CREATE TABLE tb_lock (id bigint(20) NOT NULL AUTO_INCREMENT,…

最小二乘线性回归

​ 线性回归&#xff08;linear regression&#xff09;&#xff1a;试图学得一个线性模型以尽可能准确地预测实际值的输出。 以一个例子来说明线性回归&#xff0c;假设银行贷款会根据 年龄 和 工资 来评估可放款的额度。即&#xff1a; ​ 数据&#xff1a;工资和年龄&…

企业必看的大数据安全极速传输解决方案

在这个大数据时代&#xff0c;企业在享受大数据带来的便利同时&#xff0c;也面临着巨大的挑战&#xff0c;其中最主要的问题就是数据安全方面和传输方面&#xff0c;为了更好地满足企业大数据传输的需求&#xff0c;小编将深入分析企业对于大数据传输面临的挑战和风险以及大数…

[PTQ]均匀量化和非均匀量化

均匀量化和非均匀量化 基本概念 量化出发点&#xff1a;使用整型数据类型代替浮点数据&#xff0c;从而节省存储空间同时加快推理速度。量化基本形式 均匀量化&#xff1a;浮点线性映射到定点整型上&#xff0c;可以根据scale/offset完成量化/反量化操作。非均匀量化 PowersO…

containerd Snapshots功能解析

containerd Snapshots功能解析 snapshot是containerd的一个核心功能&#xff0c;用于创建和管理容器的文件系统。 本篇containerd版本为v1.7.9。 本文以 ctr i pull命令为例&#xff0c;分析containerd的snapshot “创建” 相关的功能。 ctr命令 ctr image相关命令的实现在cmd…

OpenAI“宫斗”新进展!Sam Altman将重返OpenAI担任首席执行官 董事会成员改动

在经过激烈的五天讨论和辩论之后&#xff0c;高调人工智能初创公司OpenAI宣布&#xff0c;其联合创始人之一Sam Altman将回归担任首席执行官。这一决定是对上周Altman突然被解雇的回应&#xff0c;该决定引起了极大的关注和讨论。 OpenAI表示&#xff0c;他们已经达成了与Altm…

低代码平台推荐:五大低代码厂商谁的模式更“合适”

随着数字化时代的到来&#xff0c;低代码开发平台作为提高数字生产力的工具正受到越来越多企业的关注&#xff0c;市面上的低代码产品和厂商更是“乱花渐欲迷人眼”。 各家产品不仅功能各有不同&#xff0c;甚至商机都有区别的情况&#xff0c;如何做好产品选型已然成了采购企…

2023年国内好用的企业网盘推荐

2023年企业网盘俨然已经成为了各个企业团队的标配了&#xff0c;那么2023年国内有什么好用的企业网盘吗&#xff1f;2023国内哪个企业网盘好用&#xff1f; 国内哪个企业网盘好用&#xff1f; 由于不同行业企业对于企业网盘的具体需求点不同&#xff0c;因此我们无法从功能上评…

idea 2023 安装配置 Gradle8.4

官网&#xff1a;https://gradle.org 下载 Gradle8.4 https://gradle.org/releases/ 解压到本地&#xff0c;到 gradle-8.4\init.d 目录下新建文件&#xff1a;init.gradle 这里有个坑&#xff0c;编译报http协议安全的问题&#xff0c;解决办法&#xff0c;加入&#xff1…

【EI会议征稿】第十一届先进制造技术与材料工程国际学术会议 (AMTME 2024)

JPCS独立出版/高录用快检索/院士杰青云集 第十一届先进制造技术与材料工程国际学术会议 (AMTME 2024) 2024 11th International Conference on Advanced Manufacturing Technology and Materials Engineering 第十一届先进制造技术与材料工程国际学术会议 (AMTME 2024) 定于…

前端处理返回数据为数组对象且对象嵌套数组并重名的数据,合并名称并叠加数据

前端处理返回数据为数组对象且对象嵌套数组并重名的数据&#xff0c;合并名称并叠加数据 var newList[]; var table{}; var dataObj{}; var finalList[]; var tableData[{brName:营业部,dateStr:2023-11-23,tacheArr:[{dealCnt:20,tacheName:奔驰}]},{brName:营业部,dateStr:2…

软件开发团队如何确保团队成员与项目进度一致?

在软件开发团队中&#xff0c;确保团队成员的利益与项目进度保持一致&#xff0c;可以采取以下措施&#xff1a; 建立基础流程&#xff1a;建立几个最主要的流程&#xff0c;如任务跟踪、开发效率提升、任务完成等&#xff0c;可以帮助小团队从无序逐步进入有序。 关注员工反馈…

【逆向】NahamCon CTF -Click Me Writeup(BridaFrida Hook 拿Flag)

文章目录 前言一、样式与功能点二、反编译三、Frida Get Flag四、BurpSuite插件-Brida总结 前言 第一次做外国CTF比赛的mobile challenge 题&#xff0c;题目就是一个安卓的apk安装包。顺便记录一下代码分析过程以及分享两种不同的解题思路。 提示&#xff1a;以下是本篇文章正…

选对软件公司,助力小程序商城腾飞

选择一家合适的软件公司对于小程序商城的开发和运营至关重要。在众多的软件公司中&#xff0c;如何找到最适合自己的合作伙伴呢&#xff1f;本文将从实际需求、公司实力、案例展示、服务态度和价格等五个方面&#xff0c;为您解析如何选择合适的软件公司。 一、明确实际需求 在…

用「超舒适」突围,星纪元 ES 加量不加价

在 2023 广州车展上&#xff0c;星途星纪元 ES 正式开启预售&#xff0c;新车预售区间 24.8-35.8 万元&#xff0c;共推出五款车型配置。 外观方面&#xff0c;星纪元 ES 前脸采用了封闭式的设计&#xff0c;前大灯组采用了流行的贯穿式设计搭配矩阵大灯&#xff0c;使得整个灯…

cefsharp119.4.30(cef119.4.3Chromium119.0.6045.159)版本升级体验支持x86_h264及其他多个h264版本

Cefsharp119.4.30,cef119.4.3,Chromium119.0.6045.159 此更新包括一个高优先级安全更新 This update includes a high priority security update. 说明:此版本119.4.3支持x86_H264视频播放(需要联系我),其他版本。.NETFramework 4.6.2 NuGet Gallery | CefSharp.WinForms …

Selenium(12):层级定位_通过父元素找到子元素

层级定位 在实际的项目测试中&#xff0c;经常会遇到无法直接定位到需要选取的元素&#xff0c;但是其父元素比较容易定位&#xff0c;通过定位父元素再遍历其子元素选择需要的目标元素&#xff0c;或者需要定位某个元素下所有的子元素。 层级定位的思想是先定位父对象&#xf…

外包干了4年,技术算是没了...

先说一下自己的情况。大专生&#xff0c;19年通过校招进入湖南某软件公司&#xff0c;干了接近3年的测试&#xff0c;今年年上旬&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落&#xff01;而我已经在一个企业干了三年&#xff0c…