news 2026/4/15 23:07:12

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/4/12 8:43:45

ResNet18教程:模型服务化部署完整流程

ResNet18教程&#xff1a;模型服务化部署完整流程 1. 引言&#xff1a;通用物体识别的工程价值 在当前AI应用快速落地的背景下&#xff0c;通用物体识别已成为智能监控、内容审核、辅助驾驶和AR交互等场景的核心能力。ResNet系列作为深度卷积神经网络的经典架构&#xff0c;因…

作者头像 李华
网站建设 2026/4/15 9:54:59

超详细版PCB线宽与电流关系入门说明

PCB线宽与电流关系&#xff1a;从原理到实战的完整设计指南 你有没有遇到过这样的情况&#xff1f;电路明明功能正常&#xff0c;烧录、调试都顺利通过&#xff0c;结果一上电跑大电流&#xff0c;PCB走线就发烫冒烟&#xff0c;甚至铜箔直接“开路”——系统瞬间瘫痪。 这不是…

作者头像 李华
网站建设 2026/4/14 17:06:20

ResNet18优化实战:提升模型泛化能力的方法

ResNet18优化实战&#xff1a;提升模型泛化能力的方法 1. 背景与问题定义 1.1 通用物体识别中的挑战 在现代计算机视觉应用中&#xff0c;通用物体识别是构建智能系统的基础能力之一。基于ImageNet预训练的ResNet-18模型因其结构简洁、推理高效&#xff0c;广泛应用于边缘设…

作者头像 李华
网站建设 2026/4/15 9:55:02

使用Vitis进行Zynq嵌入式开发的核心要点说明

从零开始掌握Vitis Zynq嵌入式开发&#xff1a;软硬件协同的实战指南你有没有遇到过这样的场景&#xff1f;在FPGA板子上跑一个简单的LED闪烁程序&#xff0c;却要在Vivado里画完电路、导出比特流&#xff0c;再切换到SDK写代码&#xff0c;最后还因为地址不匹配导致初始化失败…

作者头像 李华
网站建设 2026/4/15 9:55:01

grbl步进电机调试技巧:新手教程

grbl步进电机调试实战&#xff1a;从零搭建高精度运动控制系统 你是否曾遇到这样的情况——精心组装的CNC雕刻机通电后&#xff0c;电机只抖不转&#xff1f;或者明明发送了“移动10mm”的指令&#xff0c;实际却走了9.8mm&#xff1f;又或是回零时轴一路狂奔到底&#xff0c;…

作者头像 李华
网站建设 2026/4/15 9:53:41

Realtek音频驱动架构研究:多通道音频路由设计解析

Realtek音频驱动架构揭秘&#xff1a;多通道路由如何实现“即插即用”的听觉魔法&#xff1f;你有没有过这样的体验&#xff1a;耳机一插进电脑前置面板&#xff0c;音乐立刻从音箱切换到耳塞输出&#xff0c;后置扬声器自动静音&#xff1f;游戏正在运行时&#xff0c;语音聊天…

作者头像 李华