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

果然,这道题二刷还是不会做,回去看卡尔视频了。结合灵神的题解,我对这道题有了一些新的理解。

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

对于lowestCommonAncestor()函数的返回值,我觉得灵神总结的很好,实际上就是最近公共祖先的候选值(不一定是),但是经过从下往上不断更新,最终得到的候选节点一定是最近公共祖先。

cpp 复制代码
/**
 * 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节点
    }
};
相关推荐
hie9889424 分钟前
MATLAB锂离子电池伪二维(P2D)模型实现
人工智能·算法·matlab
杰克尼35 分钟前
BM5 合并k个已排序的链表
数据结构·算法·链表
.30-06Springfield1 小时前
决策树(Decision tree)算法详解(ID3、C4.5、CART)
人工智能·python·算法·决策树·机器学习
我不是哆啦A梦1 小时前
破解风电运维“百模大战”困局,机械版ChatGPT诞生?
运维·人工智能·python·算法·chatgpt
xiaolang_8616_wjl1 小时前
c++文字游戏_闯关打怪
开发语言·数据结构·c++·算法·c++20
small_wh1te_coder1 小时前
硬件嵌入式学习路线大总结(一):C语言与linux。内功心法——从入门到精通,彻底打通你的任督二脉!
linux·c语言·汇编·嵌入式硬件·算法·c
hqxstudying2 小时前
Java创建型模式---单例模式
java·数据结构·设计模式·代码规范
挺菜的2 小时前
【算法刷题记录(简单题)002】字符串字符匹配(java代码实现)
java·开发语言·算法
sun0077002 小时前
数据结构——栈的讲解(超详细)
数据结构
凌肖战5 小时前
力扣网编程55题:跳跃游戏之逆向思维
算法·leetcode