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

力扣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.lryc.cn/news/2385071.html

相关文章:

  • 腾讯音乐一面
  • 【PhysUnits】4.4 零类型(Z0)及其算术运算(zero.rs)
  • Pluto实验报告——基于2ASK的简易的通信系统
  • Python排序函数全面指南:从基础到高级
  • 深入了解redis的哈希槽的知识
  • 农业机械化、电气化和自动化知网英文普刊:1天录用,2周见刊发表!
  • java将rtsp转成flv在浏览器播放
  • Docker-Compose使用自定义网桥后在OpenWrt系统中容器无法访问网络解决方案
  • 界面组件DevExpress WPF中文教程:Grid - 行和卡片
  • Qt enabled + geometry 属性(2)
  • Llamaindex自学笔记(完)
  • 安全生态与职业跃迁
  • 飞书知识问答深度测评:企业AI应用落地的“范本级”产品
  • draw.io的基础与进阶使用指南
  • clang的介绍与使用
  • GD32 IIC(I2C)通信(使用示例为SD2068)
  • Sanitizers
  • pip代理出现问题 ProxyError
  • Ubuntu-多显示器黑屏问题及nvidia显卡驱动安装
  • vue+threeJS 创建镂空球体(SphereGeometry)
  • [ Qt ] | 常见控件(一)
  • 【八股战神篇】Java虚拟机(JVM)高频面试题
  • Pycharm-jupyternotebook不渲染
  • lanqiaoOJ 4330:欧拉函数模板
  • NDVI谐波拟合(基于GEE实现)
  • 《虚拟即真实:数字人驱动技术在React Native社交中的涅槃》
  • 南京邮电大学《智能控制技术》期末抢救(上)
  • Cookie、Session、JWT
  • TPDS-2014《Efficient $k$-means++ Approximation with MapReduce》
  • 地理特征类可视化图像