前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >二叉树的最近公共祖先

二叉树的最近公共祖先

作者头像
初阶牛
发布于 2023-10-14 09:29:03
发布于 2023-10-14 09:29:03
22700
代码可运行
举报
文章被收录于专栏:C语言基础C语言基础
运行总次数:0
代码可运行

🎈个人主页:🎈 :✨✨✨初阶牛✨✨✨ 🐻强烈推荐优质专栏: 🍔🍟🌯C++的世界(持续更新中) 🐻推荐专栏1: 🍔🍟🌯C语言初阶 🐻推荐专栏2: 🍔🍟🌯C语言进阶 🔑个人信条: 🌵知行合一 🍉本篇简介:>:记录力扣题 二叉树的最近公共祖先. 金句分享: ✨生活本就沉默,但是跑起来有风!✨

题目介绍:

给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。

百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”

例如,给定如下二叉搜索树: root = [6,2,8,0,4,7,9,null,null,3,5]

输入:root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1 输出:3

解释:节点 5 和节点 1 的最近公共祖先是节点 3 。

输入:root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 4 输出:5

解释:节点 5 和节点 4 的最近公共祖先是节点 5 。因为根据定义最近公共祖先节点可以为节点本身。

解题思路

幻想: 如果该树是三叉树就好了,有一个指向父亲的指针,那样就可以转化为两个链表相交,求交点,只需要快慢指针就行了.

正经解题:

  1. 试着观察最近公共祖先,如果只是普通的祖先,则这两个结点都在其中的一个子树中. (1)全在该结点的左子树 (2)全在该结点的右子树
  2. 如果是最近的公共祖先,则一个结点在左子树,一个在右子树.
  3. (1) 如果全在左子树,则往左子树方向继续找. (2) 如果全在右子树,同理;
  4. 特殊情况,其中一个是另一个的祖先(父亲),直接返回该结点(祖先)即可.

代码实现:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Solution {
public:
    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        if(root==p||root==q)	//其中一个是另一个的祖先
        {
            return root;
        }
        
        //判断在不在左子树
        bool left_p=find(root->left,p);
        bool left_q=find(root->left,q);
		
		//判断在不在右子树
        bool right_p=!left_p;
        bool right_q=!left_q;
	
		
        if(left_p && left_q)
        {
        	//如果全在左子树,则往左子树继续遍历
            root=lowestCommonAncestor( root->left,p,q);
        }
        else if(right_p && right_q)
        {
        	//如果全在右子树,则往右子树继续遍历
            root=lowestCommonAncestor( root->right,p,q);
        }
        return root;
    }
    bool find(TreeNode* root,TreeNode* node)
    {
        if(root==nullptr) return false;
        if(root==node)
        {
            return true;
        }
        return find(root->left,node)||find(root->right,node);
    }
};
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-10-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验