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;
    }
};
相关推荐
ideaout技术团队2 小时前
leetcode学习笔记2:多数元素(摩尔投票算法)
学习·算法·leetcode
代码充电宝2 小时前
LeetCode 算法题【简单】283. 移动零
java·算法·leetcode·职场和发展
不枯石5 小时前
Matlab通过GUI实现点云的均值滤波(附最简版)
开发语言·图像处理·算法·计算机视觉·matlab·均值算法
不枯石5 小时前
Matlab通过GUI实现点云的双边(Bilateral)滤波(附最简版)
开发语言·图像处理·算法·计算机视觉·matlab
白水先森7 小时前
C语言作用域与数组详解
java·数据结构·算法
想唱rap7 小时前
直接选择排序、堆排序、冒泡排序
c语言·数据结构·笔记·算法·新浪微博
老葱头蒸鸡8 小时前
(27)APS.NET Core8.0 堆栈原理通俗理解
算法
视睿8 小时前
【C++练习】06.输出100以内的所有素数
开发语言·c++·算法·机器人·无人机
保持低旋律节奏9 小时前
CPP——OJ试题,string、vector、类(题三)初步应用
c++
君生我老9 小时前
C++ string类常用操作
c++