当前位置: 首页 > news >正文

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); } }
http://www.jsqmd.com/news/232151/

相关文章:

  • ResNet18应用探索:智能养殖监测系统
  • ResNet18实战:教育场景物体识别应用开发
  • serial通信在Linux中的TTL电平适配操作指南
  • ResNet18部署实战:从模型加载到WebUI展示
  • ResNet18快速入门:图像分类API开发指南
  • ResNet18应用开发:农业病虫害识别系统
  • ResNet18应用指南:多媒体内容管理系统
  • 手把手教程:对比arm64 amd64在Debian中的安装支持
  • 【行业】【网络文学】2025 年网文创作范式迁移:从升级打怪到情绪价值、缝合叙事与AI副驾驶
  • ResNet18部署案例:教育机器人视觉模块
  • Vitis中DPU配置与调优:实战经验总结
  • 工业环境下蜂鸣器选型要点:有源与无源区分全面讲解
  • 利用FPGA实现时序逻辑电路设计实验的系统学习
  • Multisim安装必备组件下载与手动注入方法
  • ResNet18实战教程:工业零件识别系统搭建
  • ResNet18实战教程:工业缺陷检测系统搭建
  • ResNet18应用开发:跨平台部署解决方案
  • ResNet18实战:基于Flask的WebUI开发完整教程
  • ResNet18入门教程:从零开始学习图像分类技术
  • ResNet18快速部署:Heroku云服务方案
  • ResNet18教程:实现移动端轻量级识别
  • ResNet18部署案例:工厂生产线质检系统实战
  • USB Serial Controller驱动下载与安装核心要点
  • 超详细版数字电路实验教程:基于Quartus的七段数码管驱动
  • ResNet18部署指南:Google Cloud配置方案
  • ResNet18实战案例:社交媒体图像自动标注
  • 操作指南:如何优化USB2.0传输速度模式
  • ResNet18性能剖析:内存占用与推理速度平衡
  • 一位全加器输入输出分析:图解说明关键路径
  • 使用Vitis进行Zynq嵌入式开发的核心要点说明