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

049二叉树的最近公共祖先

二叉树的最近公共祖先题目链接https://leetcode.cn/problems/lowest-common-ancestor-of-a-binary-tree/description/?envTypestudy-plan-v2envIdtop-100-liked我的解答public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) { StringBuilder pSb new StringBuilder(); StringBuilder qSb new StringBuilder(); //获取pSb dfs(root, p, pSb); //获取qSb dfs(root, q, qSb); //遍历pSb与qSb相同的部分 TreeNode cur root; int i 0, len Math.min(pSb.length(), qSb.length()); while(i len pSb.charAt(i) qSb.charAt(i)){ cur pSb.charAt(i) 0 ? cur.left : cur.right; i; } return cur; } public boolean dfs(TreeNode cur, TreeNode target, StringBuilder sb){ if(cur null){ return false; } if(cur target){ return true; } sb.append(0); boolean flag dfs(cur.left, target, sb); if(flag){ return flag; } sb.deleteCharAt(sb.length()-1); sb.append(1); flag dfs(cur.right, target, sb); if(flag){ return flag; } sb.deleteCharAt(sb.length()-1); return flag; }分析代码的时间复杂度为O(n)空间复杂度为O(n)。解题思路用StringBuilder记录两个节点的路径向左走为0向右走为1。遍历两个节点相同的路径部分得到的节点就是二者的最近公共祖先。看了官方题解后的解答//方法一递归 //时间复杂度O(n) //空间复杂度O(n) public TreeNode ans null; public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) { dfs(root, p, q); return ans; } public boolean dfs(TreeNode cur, TreeNode p, TreeNode q){ if(cur null){ return false; } boolean left dfs(cur.left, p, q);//左子树是否存在p节点或q节点 boolean right dfs(cur.right, p, q);//右子树是否存在p节点或q节点 //左右子树分别存在p、q的其中一个或者当前节点就是p或q且当前节点的左子树或右子树存在q或p if((left right) || (cur.val p.val || cur.val q.val) (left || right)){ ans cur; } //当前节点为根节点的子树是否存在p或q return left || right || cur.val p.val || cur.val q.val; } //方法二存储父节点 //时间复杂度O(n) //空间复杂度O(n) public MapInteger, TreeNode parent new HashMap();//key当前节点 value当前节点的父节点 public SetInteger visited new HashSet();//存储从p往上跳已经访问过的节点 public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) { parent.put(root.val, null); dfs(root); TreeNode node p; while(node ! null){ visited.add(node.val); node parent.get(node.val); } node q; while(node ! null){ if(visited.contains(node.val)){ return node; } node parent.get(node.val); } return null; } public void dfs(TreeNode cur){ if(cur.left ! null){ parent.put(cur.left.val, cur); dfs(cur.left); } if(cur.right ! null){ parent.put(cur.right.val, cur); dfs(cur.right); } }分析​ 1、方法一的解题思路递归到叶子节点从叶子节点往根节点判断是否为最近公共祖先。判断方法判断当前节点的左、右子树是否分别包含p、q的其中一个或者当前节点是否就是p或q节点且当前节点的左子树或右子树同时包含q或p若是则该节点就是p、q的最近公共祖先。​ 2、方法二的解题思路利用哈希表存储每个节点的父节点从p节点往根节点遍历并用visited记录遍历到的节点最后从q节点往根节点遍历遇到的第一个遍历过的节点就是二者的最近公共祖先。总结本题有两种解法一种是通过p、q在当前节点作为根节点的子树上的分布情况来判断另一种是通过记录遍历路径来判断。
http://www.rkmt.cn/news/1310765.html

相关文章:

  • Space Thumbnails:Windows资源管理器的终极3D模型预览解决方案
  • 第19章:Rules Engineering实战案例集
  • 保姆级教程:手把手教你用Verilog实现OpenOFDM的equalizer.v模块(子载波均衡+导频校正)
  • 解锁专业直播节奏:OBS Advanced Timer计时器插件终极指南
  • Hi3516开发板OpenHarmony标准系统环境搭建与编译烧录全攻略
  • 汽车电子架构演进:从域控制器到中央计算,解析MEB平台的软件定义汽车之路
  • 保姆级教程:用Swin Transformer骨干网在DINO上训练你的第一个自定义数据集(附环境配置避坑指南)
  • 蓝桥杯嵌入式:从零到一的考场环境搭建与避坑指南
  • 在Windows上安装APK的终极指南:5步掌握APK Installer工具
  • 从数据驱动到物理约束:盘点神经网络求解偏微分方程的三大范式与核心进展
  • SMARC嵌入式模块规范解析:从标准化接口到硬件设计实战
  • 别再只用熵权法了!用Python手把手教你实现CRITIC权重法(附完整代码与客户评分案例)
  • 开发 AI Agent 应用时如何利用 Taotoken 灵活调度不同模型执行子任务
  • 量子机器学习QPIE架构解析与工程实践
  • 5分钟掌握ROFL播放器:英雄联盟回放文件终极查看器完整指南
  • 告别机械抖动!用C语言在GRBL中实现直线路径的平滑圆弧过渡(附完整代码)
  • 别再只会用HX711了!用ADC0832和51单片机做电子秤,精度校准与误差分析实战
  • 徐州恒冠矿山机械:性价比高的苏州滚圈轮带哪家好 - LYL仔仔
  • 石家庄的姐妹别被忽悠了!所谓的“纯银”首饰,其实成本只要这个数? - 奢侈品回收测评
  • 从SolidWorks到Adams:除了Parasolid,你的模型导入后为什么动不起来?(深度解析PSMAR与接触力设置)
  • DDR4信号完整性仿真实战:从模型提取到时域波形分析
  • 企业内网系统安全集成AI能力时Taotoken的APIKey管理与审计价值
  • 别只看耐压!C0G/NP0电容在高频无线充电里怎么选?从温度系数到失效模式的全方位避坑指南
  • 甘青两地优质配电设备服务商参考:合规适配与采购指南 - 深度智识库
  • SmartDock:如何在Android设备上构建高效桌面环境
  • 费控管理常见问题解答:如何实现业财票税档一体化 - 速递信息
  • 融资信息平台不是 “中介”,是企业融资的全周期战略伙伴 - 速递信息
  • FPGA 实战进阶:基于 SGMII 接口的纯 Verilog UDP 协议栈设计与移植指南
  • GeekOS项目实战:从零实现多级反馈队列与信号量同步
  • Camunda流程版本控制与无缝迁移实战