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

力扣HOT100之二叉树: 236. 二叉树的最近公共祖先


果然,这道题二刷还是不会做,回去看卡尔视频了。结合灵神的题解,我对这道题有了一些新的理解。
首先这道题还是用递归来做,由于我们需要计算两个节点的最近公共祖先,一定是从下往上来遍历,只有先判断左右子树的情况以后,才能决定根节点是否为最近公共祖先,所以我们一定要采用后序遍历,对于一个输入节点,我们先对其左孩子和右孩子分别调用lowestCommonAncestor()函数来判断pq是否在其中,分别用两个指针leftright接收,如果leftright均不为空,说明pq在当前节点的两侧,则当前节点就是最近公共祖先,如果leftright只有一个不为空,则说明pq至少有一个节点在当前节点的一侧,如果只有一个,则将当前的节点返回上去,在上层的某个根节点迟早会出现leftright均不为空的情况,再返回那个节点即可;如果两个都在,则说明当前节点已经是最近公共祖先,将当前节点返回,在上层的节点中不可能出现leftright均不为空的情况,所以会一路返回到最外层的递归,得到最终结果。如果leftright均为空,则说明pq不在当前子树中,应当返回上层,去另外的子树中寻找,直接返回空指针即可。
对于lowestCommonAncestor()函数的返回值,我觉得灵神总结的很好,实际上就是最近公共祖先的候选值(不一定是),但是经过从下往上不断更新,最终得到的候选节点一定是最近公共祖先。

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode(int x) : val(x), left(NULL), right(NULL) {}* };*/
class Solution {
public:TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {//递归终止条件if(!root) return nullptr;if(root == p || root == q) return root; //包含了q或q为最近公共祖先的情况//单层递归逻辑//在左子树中搜索是否包含TreeNode* left = lowestCommonAncestor(root -> left, p, q);//在右子树中搜索是否包含TreeNode* right = lowestCommonAncestor(root -> right, p, q);//中if(left && right) return root;  //左右子树各有一个,当前节点就是最近公共祖先if(!left && right) return right;   //右孩子为候选节点,右子树中至少包含p,q中的一个节点if(left && !right) return left;    //左孩子为候选节点,右子树中至少包含p,q中的一个节点else return nullptr;   //当前节点的子树中不包含p、q节点}
};
http://www.xdnf.cn/news/584623.html

相关文章:

  • vue3定于组件名字的几种方法
  • 杨校老师竞赛课之青科赛GOC5-6年级组模拟题
  • ISO 26262- 5 评估硬件度量值
  • 2025年中青杯赛题浅析-快速选题
  • 12kV 环保气体绝缘交流金属封闭开关设备现场交流耐压试验规范
  • Web前端开发(HTML、CSS快速入门)
  • 2024 年地理信息技术与应用技能大赛(选拔赛/初级)——实操试题
  • 部署Prometheus并通过Grafana展示界面
  • wx.getPrivacySetting接口needAuthorization一直返回false
  • vue element-plus 集成多语言
  • SQLynx:一款跨平台的企业级数据库管理工具
  • pdf图片导出(Visio和Origin)
  • 2025口语App实测Top5!练习口语app真实口碑
  • 可视化图解算法43:数组中的逆序对
  • 鸿蒙Flutter实战:24-混合开发详解-4-初始化Flutter
  • 鸿蒙Flutter实战:25-混合开发详解-5-跳转Flutter页面
  • [Flutter]Completer和compute
  • 计量单片机 RN8302:特性、使用与应用
  • 【人工智障生成日记1】从零开始训练本地小语言模型
  • 【无标题】西门子S7-1500PLC与西门子V90 PN伺服通讯控制项目程序项目程序,共有8轴,编码器信号直接输入到变频器内。
  • 系统架构设计(十八):ATAM
  • 《棒球百科》棒球运动规则·棒球1号位
  • 【竖排繁体识别】如何将竖排繁体图片文字识别转横排繁体,转横排简体导出文本文档,基于WPF和腾讯OCR的实现方案
  • 免费轻量便携截图 录屏 OCR 翻译四合一!提升办公效率
  • 解决weman框架redis报错:Class “llluminatelRedis\RedisManager“ not found
  • 【Java高阶面经:数据库篇】18、分布式事务:如何在分库分表中实现高性能与一致性?
  • 零基础设计模式——第二部分:创建型模式 - 原型模式
  • HCIP(广域网)
  • Normalized Blind Deconvolution论文阅读
  • UART串口两种连接方式