首页 > 其他分享 >236. 二叉树的最近公共祖先 ----- 图解递归,排除左/右子树

236. 二叉树的最近公共祖先 ----- 图解递归,排除左/右子树

时间:2022-11-18 15:46:29浏览次数:47  
标签:right TreeNode 祖先 右子 ----- 二叉树 NULL root 节点

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

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

 

示例 1:

 

 


输入:root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1
输出:3
解释:节点 5 和节点 1 的最近公共祖先是节点 3 。
示例 2:

 

 


输入:root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 4
输出:5
解释:节点 5 和节点 4 的最近公共祖先是节点 5 。因为根据定义最近公共祖先节点可以为节点本身。
示例 3:

输入:root = [1,2], p = 1, q = 2
输出:1
 

提示:

树中节点数目在范围 [2, 105] 内。
-109 <= Node.val <= 109
所有 Node.val 互不相同 。
p != q
p 和 q 均存在于给定的二叉树中。

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/lowest-common-ancestor-of-a-binary-tree
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

/**
 * 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 == NULL || root == p || root == q) {
            //只要当前根节点是p和q中的任意一个,就返回(因为不能比这个更深了,再深p和q中的一个就没了)
            return root;
        }
        //根节点不是p和q中的任意一个,那么就继续分别往左子树和右子树找p和q 递归
        TreeNode* left = lowestCommonAncestor(root->left, p, q);
        TreeNode* right = lowestCommonAncestor(root->right, p, q);
        //p和q都没找到,那就没有
        if(left == NULL && right == NULL) {
            return NULL;
        }
        //左子树没有p也没有q,就返回右子树的结果 //排除左子树
        if (left == NULL) {
            return right;
        }
        //右子树没有p也没有q就返回左子树的结果 // 排除右子树
        if (right == NULL) {
            return left;
        }
        //左右子树都找到p和q了,那就说明p和q分别在左右两个子树上,所以此时的最近公共祖先就是root
        return root;
    }
};

 

优质题解

标签:right,TreeNode,祖先,右子,-----,二叉树,NULL,root,节点
From: https://www.cnblogs.com/slowlydance2me/p/16903433.html

相关文章

  • RTSP协议的处理--SETUP
       一、ABLMediaServer的过程  在CNetRtspServer::InputRtspData中处理,除了协议的回复,没有进行实质的处理。......
  • 2022-11-18 clearInterval(定时器)无法完全关闭定时器
    问题描述:vue+uniapp之小程序定时器业务原代码:clearInterval(this.timer)this.timer为定时器的容器,多此点击开启定时器然后就会发现你想使用clearInterval(this.timer)来......
  • 二叉树可视化 - 哈夫曼树
    哈夫曼树可视化importmatplotlib.pyplotaspltclassTree:def__init__(self,weight=None,left=None,right=None):self.weight=weights......
  • 基础数据结构 -链表
    链表描述:内存中内部的存储方式,通常情况下可以认为是多个节点存储一串的的结构链表存储结构数据域Datafield指针域pointerfield......
  • H7-TOOL发布V2.19,脱机烧录新增中微半导体、广芯微电子、中移芯昇以及极海和灵动新系列
    H7-TOOL详细介绍:http://www.armbbs.cn/forum.php?mod=viewthread&tid=89934【PC软件】V2.1.91.脱机烧录新增IC  --灵动MM32F0020、MM32F0133  --中微半导......
  • UED Landing 页 - 定时抓取掘金文章
    我们是袋鼠云数栈UED团队,致力于打造优秀的一站式数据中台产品。我们始终保持工匠精神,探索前端道路,为社区积累并传播经验价值。本文作者:琉易https://liuxianyu.cn......
  • JavaWeb-06-Servlet
    6.Servlet6.1Servlet简介Servlet就是sun公司开发动态web的一门技术Sun公司在这些API中提供了一个接口叫作:Servlet,如果要开发一个Servlet程序,只需要完成两个步骤:编......
  • loongnix-server配置 root 自动登陆
    loongnix-server窗口界面默认必须输入用户名和密码登陆,但是我们可以通过配置让lightdm支持root登陆,配置如下:vim/etc/lightdm/lightdm.conf直接在最下方添加以下......
  • 算法学习-1 算法复杂度
    一算法复杂度算法复杂度分为时间复杂度和空间复杂度。时间复杂度是指执行算法所需要的计算工作量;而空间复杂度是指执行这个算法所需要的内存空间。算法的复杂性体运行该......
  • python-飞机大战1-项目实战
    目标强化面向对象程序设计体验使用​​pygame​​模块进行游戏开发实战步骤​​pygame​​快速体验飞机大战实战确认模块——pygame​​pygame​​就是一个Pytho......