news 2026/6/11 17:25:57

A.每日一题——865. 具有所有最深节点的最小子树

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
A.每日一题——865. 具有所有最深节点的最小子树

题目链接:865. 具有所有最深节点的最小子树(中等)

完全相同的题目:1123. 最深叶节点的最近公共祖先(中等)

算法原理:

解法一:递归—整体看

0ms击败100.00%

时间复杂度O(N)

①递归二叉树,同时逐步更新全局最大深度

②“递”的时候往下传该节点的深度depth

③“归”的时候往上带回该节点所在子树的最深深度

④如果左右子树的最深深度与当前全局最深深度相同,那么我们可以更新待返回的结果,但这不能直接返回,是因为这很可能不是最深的叶子节点所在子树,如果后面还有更深的,还会继续更新

解法二:自底而上—局部看

0ms击败100.00%

时间复杂度O(N)

也可以不用全局变量记录整棵树的高度,而是把每棵子树都看成一个个子问题

left高度>right高度时,node子树高度为left高度+1,最近公共祖先是左子树的最近公共祖先

left高度<right高度时,node子树高度为right高度+1,最近公共祖先是右子树的最近公共祖先

left高度=right高度时,node子树高度为left高度+1,最近公共祖先就是node

Java代码:

/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val = val; } * TreeNode(int val, TreeNode left, TreeNode right) { * this.val = val; * this.left = left; * this.right = right; * } * } */ //解法一:递归 class Solution { private int maxdepth=-1;//全局最大深度 private TreeNode ret; public TreeNode subtreeWithAllDeepest(TreeNode root) { dfs(root,0); return ret; } private int dfs(TreeNode node,int depth){ if(node==null){ maxdepth=Math.max(maxdepth,depth); return depth; } int leftdepth=dfs(node.left,depth+1); int rightdepth=dfs(node.right,depth+1); //当leftdepth==rightdepth==maxdepth时,node就是目前最佳答案 if(leftdepth==rightdepth&&leftdepth==maxdepth) ret=node; return Math.max(leftdepth,rightdepth);//往回带最深的深度 } }
/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val = val; } * TreeNode(int val, TreeNode left, TreeNode right) { * this.val = val; * this.left = left; * this.right = right; * } * } */ //解法二:自底而上 class Solution { //自定义记录类:Java 16+支持record //作用:一次返回两个关键信息(最大高度,最近公共祖先) private record Pair(int height,TreeNode lca){} public TreeNode subtreeWithAllDeepest(TreeNode root) { //调用dfs获取整棵树的高度和对应LCA,直接返回LCA即可 return dfs(root).lca(); } //后序遍历:计算当前子树的高度+所有最深节点的LCA private Pair dfs(TreeNode node){ //递归出口:空节点,空树高度为0,没有节点,所以LCA为null if(node==null) return new Pair(0,null); Pair left=dfs(node.left); Pair right=dfs(node.right); //情况一:左子树最大高度>右子树最大高度 //说明最深节点在左子树中 //当前子树高度=左子树最大高度+1,LCA为左子树的LCA if(left.height()>right.height()) return new Pair(left.height()+1,left.lca()); //情况二:左子树最大高度<右子树最大高度 if(left.height()<right.height()) return new Pair(right.height()+1,right.lca()); //情况三:左右子树最大高度相等 //说明最深节点同时分布在左右子树中->当前节点就是最近公共祖先 //当前子树高度=左/右子树高度+1 return new Pair(left.height()+1,node); } }
/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val = val; } * TreeNode(int val, TreeNode left, TreeNode right) { * this.val = val; * this.left = left; * this.right = right; * } * } */ //解法二的第二种写法,博主觉得比前一种写法更易懂一些 class Solution { public TreeNode subtreeWithAllDeepest(TreeNode root) { return dfs(root).getValue(); } private Pair<Integer,TreeNode> dfs(TreeNode node){ if(node==null) return new Pair<>(0,null); Pair<Integer,TreeNode> left=dfs(node.left); Pair<Integer,TreeNode> right=dfs(node.right); if(left.getKey()>right.getKey()) return new Pair(left.getKey()+1,left.getValue()); if(left.getKey()<right.getKey()) return new Pair(right.getKey()+1,right.getValue()); return new Pair(left.getKey()+1,node); } }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/23 14:03:37

ResNet18实战:构建高可用物体识别API

ResNet18实战&#xff1a;构建高可用物体识别API 1. 通用物体识别与ResNet-18技术背景 在计算机视觉领域&#xff0c;通用物体识别是基础且关键的任务之一。它要求模型能够从一张图像中理解并分类出最可能的物体或场景类别&#xff0c;涵盖从动物、交通工具到自然景观等上千种…

作者头像 李华
网站建设 2026/6/9 16:35:59

ResNet18物体识别参数详解:Top-3置信度解析

ResNet18物体识别参数详解&#xff1a;Top-3置信度解析 1. 引言&#xff1a;通用物体识别中的ResNet-18价值定位 在当前AI视觉应用广泛落地的背景下&#xff0c;轻量级、高稳定性、无需联网依赖的本地化图像分类方案正成为开发者和边缘计算场景的核心需求。传统的云API识别服…

作者头像 李华
网站建设 2026/6/3 4:42:18

Vivado下载常见问题解析:工业场景应用避坑

Vivado下载常见问题解析&#xff1a;工业场景应用避坑 为什么“Vivado下载”在工厂里总是卡住&#xff1f; 你有没有遇到过这样的情况&#xff1a;项目进度紧张&#xff0c;FPGA板子已经贴好片&#xff0c;结果工控机上装Vivado时卡在驱动安装&#xff1b;或者从官网下载安装包…

作者头像 李华
网站建设 2026/6/6 1:08:34

ResNet18应用开发:农业病虫害识别系统

ResNet18应用开发&#xff1a;农业病虫害识别系统 1. 引言&#xff1a;从通用物体识别到农业场景落地 在人工智能赋能千行百业的今天&#xff0c;深度学习模型正逐步从实验室走向田间地头。ResNet18作为经典轻量级卷积神经网络&#xff0c;在ImageNet大规模图像分类任务中表现…

作者头像 李华
网站建设 2026/6/10 7:52:32

ResNet18实战教程:工业缺陷检测系统搭建

ResNet18实战教程&#xff1a;工业缺陷检测系统搭建 1. 引言 1.1 工业视觉检测的智能化转型 在现代制造业中&#xff0c;产品质量控制是保障生产效率与品牌信誉的核心环节。传统的人工目检方式存在主观性强、效率低、漏检率高等问题&#xff0c;难以满足高节拍、高精度的产线…

作者头像 李华
网站建设 2026/6/5 20:56:56

obet 实现dbv功能(obet数据文件坏块检测)

通过一段时间的测试和使用,obet修复了不少bug,关于obet的以往功能和特性的文章: OBET工具使用说明 Oracle数据块编辑工具( Oracle Block Editor Tool)-obet 并且也在客户的生产环境上进行了实战:obet快速修改scn/resetlogs恢复数据库(缺少归档,ORA-00308&#xff09;.利用周末…

作者头像 李华