Day119 | 灵神 | 二叉树 | 二叉树的最近共公共祖先

Day119 | 灵神 | 二叉树 | 二叉树的最近共公共祖先

236.二叉树的最近共公共祖先

236. 二叉树的最近公共祖先 - 力扣(LeetCode)

思路:

二叉树的最近公共祖先【基础算法精讲 12】_哔哩哔哩_bilibili

首先我们采用后序遍历

递归函数返回值是问是「最近公共祖先的候选项」。对于最外层的递归调用者来说,返回值是最近公共祖先的意思。但是,在递归过程中,返回值可能是最近公共祖先,也可能是空节点(表示子树内没找到任何有用信息)、节点 p 或者节点 q(可能成为最近公共祖先,或者用来辅助判断上面的某个节点是否为最近公共祖先)。

1.当前节点的是空节点

那就返回空

2.当前结点是p或者q,直接返回当前结点就行

比如5是p,4是q,那么我们遍历到5就直接返回5就行,因为5是5和4的最近公共祖先

3.如果左右子树都有的话,也就是pq分别在这当前结点的左右子树,那么最近公共祖先就是当前结点

4.如果只在左子树中找到了q或者p,那说明最近公共祖先肯定在左子树,返回遍历左子树的结果就行

右子树是同理的

5.当前结点的左右子树都没找到p或者q,那说明在其他的子树

返回nullptr

完整代码:

cpp 复制代码
class Solution {
public:
    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        //1.当前结点为空或者q或者p,返回当前结点
        if(root==nullptr || root==p || root==q)
            return root;
        TreeNode *l=lowestCommonAncestor(root->left,p,q);
        TreeNode *r=lowestCommonAncestor(root->right,p,q);
        //2.左右子树中分别找到了p或者q
        if(l!=nullptr&&r!=nullptr)
            return root;
        //3.p和q全在右子树中
        else if(l==nullptr&&r!=nullptr)
            return r;
        //4.p和q全在左子树中
        else if(l!=nullptr&&r==nullptr)
            return l;
        //5.q和p不在当前子树
        else
            return nullptr;
    }
};
相关推荐
码林拾遗WJ4 分钟前
告警分级的自动化实测:模型判断 vs 人工拍板
人工智能·算法·自动化
Tisfy18 分钟前
LeetCode 0453.最小操作次数使数组元素相等:两次遍历(反向思维)
算法·leetcode·题解·遍历·反向思维
君万31 分钟前
【LeetCode每日一题】回溯:46. 全排列 78. 子集 39. 组合总和
算法·leetcode·go
La Pulga1 小时前
【FreeRTOS源码学习笔记】链表的实现
数据结构·笔记·stm32·mcu·链表·嵌入式·freertos
Keep_Trying_Go1 小时前
Consistent-Point半监督人群计数算法详解
人工智能·深度学习·算法·计算机视觉·人群计数
在所不辞兄1 小时前
【零基础学智能仿真-69】综合项目——材料参数驱动的仿真研究
人工智能·深度学习·神经网络·算法·机器学习·1024程序员节
凉茶钱2 小时前
红黑树:用“颜色”换“平衡”,set 与 map 的底层发动机
开发语言·c++·红黑树
番茄味城市甜菜3 小时前
数据结构:双向链表实现,链表与顺序表的对比
数据结构·链表
怕浪猫3 小时前
Super-agent 在各大模型厂商的应用情况
算法·面试·github
海绵宝宝转agent3 小时前
LeetCode100 二叉树个人题解
算法·leetcode·深度优先