【LeetCode75】第三十八题 二叉树的最近公共祖先

这篇具有很好参考价值的文章主要介绍了【LeetCode75】第三十八题 二叉树的最近公共祖先。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

题目:

示例:

分析:

代码:


题目:

【LeetCode75】第三十八题 二叉树的最近公共祖先,LeetCode75题解,算法,c++,数据结构,leetcode

示例:

【LeetCode75】第三十八题 二叉树的最近公共祖先,LeetCode75题解,算法,c++,数据结构,leetcode

分析:

 给我们一棵二叉树,然后给我们pq两个节点,让我们找出二叉树中它们俩的最近的公共祖先。

那么什么样的节点是它们俩的最近的公共祖先呢,是有两种情况,第一种情况的pq两个节点都在同一条路径上,像下图这样:

【LeetCode75】第三十八题 二叉树的最近公共祖先,LeetCode75题解,算法,c++,数据结构,leetcode

 那这时pq的最近公共祖先就是pq之中更靠进上层的那个节点,也就是pq之中有个节点是自己的祖先节点。

另一种情况就是,他们分布在它们公共祖先的左右两侧,也就是pq里其中一个在最近公共祖先的左子树上,另一个在最近公共祖先的右子树上,像下图这样:

【LeetCode75】第三十八题 二叉树的最近公共祖先,LeetCode75题解,算法,c++,数据结构,leetcode

 因为pq已经各自分布在这个节点的左右两侧了,如果这个节点再往下走,不管是走哪个方向,都不可能再同时是它们两个节点的公共祖先了。

所以我们在递归遍历二叉树的时候,一旦发现了pq分布在某个节点的左右两侧,或是直接遍历到了pq节点,那就将当前节点返回出去即可。

我们做常规的遍历二叉树,并且再遍历里头再套一层递归遍历分别去当前节点的左子树和右子树寻找是否有pq节点。

在递归遍历之前先检测当前节点是否是pq之一,是的话直接返回当前节点。

如果pq分别分布在当前节点的左右子树,那么也直接返回当前节点。

最后一种情况就是,pq分布在当前节点的同一侧。

 【LeetCode75】第三十八题 二叉树的最近公共祖先,LeetCode75题解,算法,c++,数据结构,leetcode

这时候虽然当前节点也还是两个节点的公共祖先,但并不是最近的公共祖先,并且因为pq都在当前节点的某棵子树上(左子树或是右子树),那么它们的最近公共祖先必然是在当前节点的子树,所以在我们需要将当前节点向那棵子树上转移,直到出现上面第一第二种情况。【LeetCode75】第三十八题 二叉树的最近公共祖先,LeetCode75题解,算法,c++,数据结构,leetcode文章来源地址https://www.toymoban.com/news/detail-677237.html

代码:

class Solution {
public:
    bool find(TreeNode* root,TreeNode*p,TreeNode* q){   //寻找是否有pq
        if(root==nullptr) return false;
        if(root==p || root==q) return true;
        return find(root->left,p,q)||find(root->right,p,q);
    }
    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        if(root==p||root==q) return root;
        TreeNode* res=root;
        bool l=find(root->left,p,q);bool r=find(root->right,p,q);
        while(l||r){    
            //如果自己本身就是其中一个节点,那么直接返回即可
            if(res==p||res==q) return res;
            if(l&&!r){  //如果pq全部集中在左子树,就往左子树移动  
                res=res->left;    
            }else if(r&&!l){    //如果pq全部集中在右子树,就往右子树移动
                res=res->right;
            }else{  //如果是左右各占一个,那么返回该节点
                return res;
            }
            //寻找pq的分布情况
            l=find(res->left,p,q);
            r=find(res->right,p,q);
        }
        return root;
    }
};

到了这里,关于【LeetCode75】第三十八题 二叉树的最近公共祖先的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 【Leetcode60天带刷】day14二叉树——144.二叉树的前序遍历,145.二叉树的后序遍历,94.二叉树的中序遍历

    【Leetcode60天带刷】day14二叉树——144.二叉树的前序遍历,145.二叉树的后序遍历,94.二叉树的中序遍历

    144. 二叉树的前序遍历 给你二叉树的根节点  root  ,返回它节点值的  前序   遍历。 示例 1: 示例 2: 示例 3: 示例 4: 示例 5: 提示: 树中节点数目在范围  [0, 100]  内 -100 = Node.val = 100 145. 二叉树的后序遍历 给你一棵二叉树的根节点  root  ,返回其节点值的  后序遍历

    2024年02月10日
    浏览(17)
  • 【LeetCode】102. 二叉树的层序遍历、107. 二叉树的层序遍历 II

    【LeetCode】102. 二叉树的层序遍历、107. 二叉树的层序遍历 II

     作者:小卢 专栏:《Leetcode》 喜欢的话:世间因为少年的挺身而出,而更加瑰丽。                                  ——《人民日报》 102. 二叉树的层序遍历 给你二叉树的根节点  root  ,返回其节点值的  层序遍历  。 (即逐层地,从左到右访问所有节点)  示例:

    2024年02月13日
    浏览(11)
  • 二叉树OJ题:LeetCode--104.二叉树的最大深度

    二叉树OJ题:LeetCode--104.二叉树的最大深度

    朋友们、伙计们,我们又见面了,本期来给大家解读一下LeetCode中第104道二叉树OJ题,如果看完之后对你有一定的启发,那么请留下你的三连,祝大家心想事成! 数据结构与算法专栏: 数据结构与算法 个  人  主  页  : stackY、 C 语 言 专 栏 : C语言:从入门到精通  Leet

    2024年02月11日
    浏览(14)
  • 二叉树OJ题:LeetCode--144.二叉树的前序遍历

    二叉树OJ题:LeetCode--144.二叉树的前序遍历

    朋友们、伙计们,我们又见面了,本期来给大家解读一下LeetCode中第144道二叉树OJ题,如果看完之后对你有一定的启发,那么请留下你的三连,祝大家心想事成! 数据结构与算法专栏: 数据结构与算法 个  人  主  页  : stackY、 C 语 言 专 栏 : C语言:从入门到精通  Leet

    2024年02月13日
    浏览(12)
  • LeetCode算法二叉树—222. 完全二叉树的节点个数

    LeetCode算法二叉树—222. 完全二叉树的节点个数

    目录 222. 完全二叉树的节点个数 - 力扣(LeetCode) 代码: 运行结果:  给你一棵  完全二叉树  的根节点  root  ,求出该树的节点个数。 完全二叉树 的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集

    2024年02月07日
    浏览(20)
  • 【Leetcode -101.对称二叉树 -144.二叉树的前序遍历】

    【Leetcode -101.对称二叉树 -144.二叉树的前序遍历】

    题目:给你一个二叉树的根节点 root , 检查它是否轴对称。 示例 1: 输入:root = [1, 2, 2, 3, 4, 4, 3] 输出:true 示例 2: 输入:root = [1, 2, 2, null, 3, null, 3] 输出:false 提示: 树中节点数目在范围[1, 1000] 内 100 = Node.val = 100 思路 :化为子问题比较左子树和右子树是否对称;结束条

    2024年02月09日
    浏览(10)
  • leetcode543--二叉树的直径

    1. 题意 求二叉树上最远两个节点之间的距离。 2. 题解 2.1 暴力 最长路径的三种情况 通过根节点 在左子树 在右子树 通过根节点的最长路径长度一定是左右子树深度之和。 但是这样求左右子树的深度会不断重复,所以复杂度很高。 2.2 动态规划 我们可以在求深度的时候,更新

    2024年04月26日
    浏览(10)
  • LeetCode:二叉树的前、中、后序遍历——如何创建一棵【二叉树】

    LeetCode:二叉树的前、中、后序遍历——如何创建一棵【二叉树】

    🍎道阻且长,行则将至。🍓 🌻算法,不如说它是一种思考方式🍀 算法专栏: 👉🏻123 二叉树是一种树形数据结构,其每个节点 最多只有两个子节点 。通常将节点分为三种类型:根节点、内部节点和叶子节点。其中,根节点是二叉树的唯一访问起点,内部节点具有一个父

    2023年04月09日
    浏览(9)
  • 代码随想录 Day13 二叉树 LeetCode T104 二叉树的最大深度 T111 二叉树的最小深度 T222完全二叉树的节点个数

    代码随想录 Day13 二叉树 LeetCode T104 二叉树的最大深度 T111 二叉树的最小深度 T222完全二叉树的节点个数

    以下题解的更详细思路来自于:代码随想录 (programmercarl.com) 二叉树的高度与深度 这里先补充一下二叉树深度和高度的概念 高度:二叉树中任意一个节点到叶子结点的距离 深度:二叉树中任意一个节点到根节点的距离 下面给出一个图便于理解 获取高度与深度的遍历方式 高度:后

    2024年02月08日
    浏览(15)
  • LeetCode刷题--- 二叉树的所有路径

    LeetCode刷题--- 二叉树的所有路径

    个人主页:元清加油_【C++】,【C语言】,【数据结构与算法】-CSDN博客 个人专栏 力扣递归算法题       【     】 【C++】                  【   】 数据结构与算法       【    】 前言:这个专栏主要讲述递归递归、搜索与回溯算法,所以下面题目主要也是这些算法做的

    2024年01月19日
    浏览(11)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包