天津企业网络建站英雄联盟网站设计

张小明 2026/1/14 17:46:46
天津企业网络建站,英雄联盟网站设计,网站设计想法,土人景观设计公司官网865. 具有所有最深节点的最小子树 问题描述 给定一个二叉树的根节点 root#xff0c;返回包含所有最深节点的最小子树的根节点。 最深节点#xff1a;距离根节点最远的叶子节点 最小子树#xff1a;满足条件的子树中节点数最少的那个#xff08;如果多个子树包含所有最深节…865. 具有所有最深节点的最小子树问题描述给定一个二叉树的根节点root返回包含所有最深节点的最小子树的根节点。最深节点距离根节点最远的叶子节点最小子树满足条件的子树中节点数最少的那个如果多个子树包含所有最深节点返回深度最大的那个注意一个节点也可以是自己的子树最深节点可能有多个示例输入:root[3,5,1,6,2,0,8,null,null,7,4]输出:[2,7,4]解释:最深节点是7和4包含它们的最小子树根节点是23 / \ 5 1 / \ / \ 6 2 0 8 / \ 7 4输入:root[1]输出:[1]输入:root[0,1,3,null,2]输出:[2]解释:最深节点只有2所以最小子树就是[2]0 / \ 1 3 \ 2算法思路深度优先搜索 返回深度和节点核心最深节点一定在树的最大深度层包含所有最深节点的最小子树 最深节点的最近公共祖先LCA关键如果左右子树的最大深度相等说明最深节点分布在两侧当前节点就是答案如果左子树深度 右子树深度答案在左子树中如果右子树深度 左子树深度答案在右子树中DFS对每个节点递归计算左右子树的最大深度同时返回该子树中包含所有最深节点的最小子树根节点通过比较左右子树深度来决定当前节点是否为答案返回值方法返回一个对象包含子树根节点和最大深度或者使用全局变量记录方法只返回深度代码实现方法一返回深度和节点classSolution{/** * 返回包含所有最深节点的最小子树 * 使用DFS返回每个子树的深度和对应的最小子树根节点 * * param root 二叉树根节点 * return 最小子树的根节点 */publicTreeNodesubtreeWithAllDeepest(TreeNoderoot){Resultresultdfs(root);returnresult.node;}/** * DFS * return Result对象包含子树根节点和最大深度 */privateResultdfs(TreeNodenode){// 空节点深度为0节点为nullif(nodenull){returnnewResult(null,0);}// 递归处理左右子树Resultleftdfs(node.left);Resultrightdfs(node.right);// 如果左子树深度更大答案在左子树中if(left.depthright.depth){returnnewResult(left.node,left.depth1);}// 如果右子树深度更大答案在右子树中elseif(right.depthleft.depth){returnnewResult(right.node,right.depth1);}// 左右子树深度相等当前节点就是答案else{returnnewResult(node,left.depth1);}}/** * 存储子树根节点和深度 */privatestaticclassResult{TreeNodenode;intdepth;Result(TreeNodenode,intdepth){this.nodenode;this.depthdepth;}}}方法二全局变量 返回深度classSolution{privateTreeNoderesult;privateintmaxDepth;/** * 使用全局变量记录 */publicTreeNodesubtreeWithAllDeepest(TreeNoderoot){resultnull;maxDepth-1;dfs(root,0);returnresult;}/** * 返回以node为根的子树的最大深度 * 同时更新全局答案 */privateintdfs(TreeNodenode,intdepth){if(nodenull){returndepth;}// 获取左右子树的最大深度intleftDepthdfs(node.left,depth1);intrightDepthdfs(node.right,depth1);// 当前子树的最大深度intcurrentMaxDepthMath.max(leftDepth,rightDepth);// 如果左右子树深度相等说明当前节点包含所有最深节点if(leftDepthrightDepth){// 更新全局深度更大的优先if(currentMaxDepthmaxDepth){maxDepthcurrentMaxDepth;resultnode;}}returncurrentMaxDepth;}}方法三先找最深节点再找LCAimportjava.util.*;classSolution{/** * 先找到所有最深节点再找它们的LCA */publicTreeNodesubtreeWithAllDeepest(TreeNoderoot){if(rootnull)returnnull;// 找到最大深度intmaxDepthgetMaxDepth(root);// 找到所有最深节点SetTreeNodedeepestNodesnewHashSet();findDeepestNodes(root,deepestNodes,maxDepth,1);// 如果只有一个最深节点直接返回if(deepestNodes.size()1){returndeepestNodes.iterator().next();}// 找所有最深节点的LCAreturnfindLCA(root,deepestNodes);}privateintgetMaxDepth(TreeNodenode){if(nodenull)return0;return1Math.max(getMaxDepth(node.left),getMaxDepth(node.right));}privatevoidfindDeepestNodes(TreeNodenode,SetTreeNodedeepestNodes,intmaxDepth,intcurrentDepth){if(nodenull)return;if(currentDepthmaxDepth){deepestNodes.add(node);return;}findDeepestNodes(node.left,deepestNodes,maxDepth,currentDepth1);findDeepestNodes(node.right,deepestNodes,maxDepth,currentDepth1);}privateTreeNodefindLCA(TreeNodenode,SetTreeNodetargets){if(nodenull)returnnull;// 如果当前节点是最深节点之一if(targets.contains(node)){returnnode;}TreeNodeleftfindLCA(node.left,targets);TreeNoderightfindLCA(node.right,targets);// 如果左右子树都包含目标节点当前节点是LCAif(left!nullright!null){returnnode;}// 否则返回非空的一侧returnleft!null?left:right;}}算法分析时间复杂度O(n)每个节点只被访问一次方法一和二只需要一次DFS遍历方法三需要多次遍历总体仍是O(n)空间复杂度O(h)h是树的高度递归栈空间方法一O(h)递归栈 Result对象方法二O(h)递归栈 全局变量方法三O(n)存储最深节点的Set算法过程1root [3,5,1,6,2,0,8,null,null,7,4]DFS叶子节点6,7,4,0,8返回(node, depth1)节点2left (7,1), right (4,1)深度相等 → 返回(2, 2)节点5left (6,1), right (2,2)right.depth left.depth → 返回(2, 3)节点1left (0,1), right (8,1)深度相等 → 返回(1, 2)根节点3left (2,3), right (1,2)left.depth right.depth → 返回(2, 4)结果节点22root [0,1,3,null,2]DFS节点2返回(2,1)节点1left (null,0), right (2,1)→ 返回(2,2)节点3返回(3,1)根节点0left (2,2), right (3,1)→ 返回(2,3)结果节点2测试用例// TreeNode定义classTreeNode{intval;TreeNodeleft;TreeNoderight;TreeNode(){}TreeNode(intval){this.valval;}TreeNode(intval,TreeNodeleft,TreeNoderight){this.valval;this.leftleft;this.rightright;}}publicclassMain{publicstaticvoidmain(String[]args){SolutionsolutionnewSolution();// 测试用例1标准示例TreeNoderoot1newTreeNode(3);root1.leftnewTreeNode(5);root1.rightnewTreeNode(1);root1.left.leftnewTreeNode(6);root1.left.rightnewTreeNode(2);root1.right.leftnewTreeNode(0);root1.right.rightnewTreeNode(8);root1.left.right.leftnewTreeNode(7);root1.left.right.rightnewTreeNode(4);TreeNoderesult1solution.subtreeWithAllDeepest(root1);System.out.println(Test 1: result1.val);// 2// 测试用例2单节点TreeNoderoot2newTreeNode(1);TreeNoderesult2solution.subtreeWithAllDeepest(root2);System.out.println(Test 2: result2.val);// 1// 测试用例3链状树TreeNoderoot3newTreeNode(0);root3.leftnewTreeNode(1);root3.left.rightnewTreeNode(2);root3.rightnewTreeNode(3);TreeNoderesult3solution.subtreeWithAllDeepest(root3);System.out.println(Test 3: result3.val);// 2// 测试用例4完全平衡树TreeNoderoot4newTreeNode(1);root4.leftnewTreeNode(2);root4.rightnewTreeNode(3);TreeNoderesult4solution.subtreeWithAllDeepest(root4);System.out.println(Test 4: result4.val);// 1// 测试用例5左偏树TreeNoderoot5newTreeNode(1);root5.leftnewTreeNode(2);root5.left.leftnewTreeNode(3);TreeNoderesult5solution.subtreeWithAllDeepest(root5);System.out.println(Test 5: result5.val);// 3// 测试用例6右偏树TreeNoderoot6newTreeNode(1);root6.rightnewTreeNode(2);root6.right.rightnewTreeNode(3);TreeNoderesult6solution.subtreeWithAllDeepest(root6);System.out.println(Test 6: result6.val);// 3// 测试用例7三个最深节点TreeNoderoot7newTreeNode(1);root7.leftnewTreeNode(2);root7.rightnewTreeNode(3);root7.left.leftnewTreeNode(4);root7.left.rightnewTreeNode(5);root7.right.leftnewTreeNode(6);TreeNoderesult7solution.subtreeWithAllDeepest(root7);System.out.println(Test 7: result7.val);// 1}}关键点深度相等左右子树深度相等说明最深节点分布在两侧当前节点是这些最深节点的最近公共祖先为什么深度更大的优先要求最小子树在多个满足条件的子树中深度更大的子树包含的节点更少。递归通过比较子树深度找到了包含所有最深节点的最小子树不需要显式找到所有最深节点边界处理空树返回null单节点返回自身只有一个最深节点返回该节点常见问题为什么不用先找到所有最深节点再找LCA需要额外的存储空间和多次遍历。DFS一次遍历更高效。时间复杂度为什么是O(n)每个节点只被访问一次。
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

广东省网站集约化建设方案公司是做小程序还是做网站

我将为您开发一个学生学习效率分析系统,能够分析作业完成时间模式,识别效率低谷期,并提供个性化的时间管理建议。项目结构study_efficiency_analyzer/├── main.py # 主程序入口├── data_collector.py # 数据收集模块├── analyzer.py…

张小明 2026/1/12 2:35:42 网站建设

官方网站建设银行年利息是多少钱修改wordpress登录页面

Rust Deref 自动调用完全指南&#xff1a;理解解引用强制多态 概述 在 Rust 中&#xff0c;Deref trait 是实现自定义解引用行为的关键。当类型 T 实现了 Deref<Target U> 时&#xff0c;编译器会在特定场景下自动插入 deref() 调用&#xff0c;这个过程称为解引用强制多…

张小明 2026/1/12 16:40:43 网站建设

巫溪网站建设找附近的装修公司

Linly-Talker在射击运动中的瞄准要领说明 在现代射击训练中&#xff0c;一个微小的动作偏差就可能导致命中精度的显著下降。传统教学依赖教练反复示范与口头纠正&#xff0c;但受限于人力、时间和表达一致性&#xff0c;难以实现全天候、个性化的精准指导。随着人工智能技术的发…

张小明 2026/1/13 3:41:30 网站建设

初学者的网站建设贵阳专用网站建设

App-V 安装与包创建全流程指南 1. 前期准备 在开始进行 App - V 相关操作之前,有一些重要的前期准备工作需要完成。首先,在进行应用程序序列化之前,要对序列化工作站进行全面的病毒和恶意软件扫描。扫描完成后,需禁用以下可能在序列化过程中运行或即将运行的程序: - Win…

张小明 2026/1/11 12:00:27 网站建设

霸州做网站1766534168做网站的程序

Wan2.2-T2V-A14B模型在极光天文现象科普视频中的大气光学模拟 在遥远的北极夜空&#xff0c;绿色光带如丝绸般舞动&#xff0c;边缘泛着紫色微光——这种被称为极光的自然奇观&#xff0c;本质上是太阳风粒子与地球高层大气碰撞后激发原子辐射的结果。它涉及复杂的电磁场动力学…

张小明 2026/1/13 1:41:53 网站建设

网站开发vs2015是什么wordpress连连支付

Qwen3-4B-FP8&#xff1a;开源大模型双模式革命与能效突破 【免费下载链接】Qwen3-4B-FP8 项目地址: https://ai.gitcode.com/hf_mirrors/Qwen/Qwen3-4B-FP8 导语 阿里巴巴通义千问团队推出Qwen3-4B-FP8开源模型&#xff0c;通过创新的双模式推理设计与FP8量化技术&am…

张小明 2026/1/11 9:29:41 网站建设