【简单】面试题68 - II. 二叉树的最近公共祖先

寻找二叉树中两个节点的最近公共祖先节点 非递归寻找两个节点的最近公共祖先节点 上一篇博文给出了寻找一个结点的所有祖先节点,那么求两个节点的最近公共祖先就很容易了,首先后序遍历找到两个节点各自的祖先列表,都存在了栈中,越靠近栈顶的元素就离对应节点越近,所以只需要将两个栈元素出栈知道栈顶元素第一次相等就可以找到最近公共祖先了。 #include <iostream> #include <stack> using n... 阅读详情

【题目】
给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。
来源:leetcode
链接:https://leetcode-cn.com/problems/er-cha-shu-de-zui-jin-gong-gong-zu-xian-lcof/
【示例】
输入: 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。因为根据定义最近公共祖先节点可以为节点本身。
【说明】
所有节点的值都是唯一的。
p、q 为不同节点且均存在于给定的二叉树中
【代码】

/**
 * 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:
    stack<TreeNode*> s1,s2;
    void postOrder(TreeNode* root,TreeNode* findnode,stack<TreeNode*> &rs){
        TreeNode* node=root,*last=NULL;
        while(node||!rs.empty()){
            while(node){
                rs.push(node);
                node=node->left;
            }
            if(!rs.empty()){
                node=rs.top();
                if(node->right&&node->right!=last)
                    node=node->right;
                else{
                    if(node->val==findnode->val)
                        return;
                    rs.pop();
                    last=node;
                    node=NULL;
                }
            }
        }
    }
    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        postOrder(root,p,s1);
        postOrder(root,q,s2);
        int minnum=min(s1.size(),s2.size());                
        while(s1.size()>minnum)
            s1.pop();
        while(s2.size()>minnum)
            s2.pop();
        while(!s1.empty()){
            if(s1.top()->val==s2.top()->val)
                return s1.top();
            s1.pop();
            s2.pop();
        }        
        return root;
    }
};

【方法二】

class Solution {
public:
    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        if(!root||root==p||root==q)        
            return root;
        TreeNode* left=lowestCommonAncestor(root->left,p,q);
        TreeNode* right=lowestCommonAncestor(root->right,p,q);
        if(!left)
            return right;
        if(!right)
            return left;
        return root;
    }
};
68 - II. 二叉树的最近公共祖先【难】 【二叉树的最近公共祖先】 https://www.bilibili.com/video/BV1W44y1Z7AR/?中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(例如,给定如下二叉树: root = [3,5,1,6,2,0,8,null,null,7,4]节点 5 和节点 4 的最近公共祖先是节点 5。因为根据定义最近公共祖先节点可以为节点本身。节点 5 和节点 1 的最近公共祖先是节点 3。 阅读详情

相关推荐

68 - I. 二叉搜索树的最近公共祖先

中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(例如,给定如下二叉搜索树: root = [6,2,8,0,4,7,9,null,null,3,5]节点 2 和节点 4 的最近公共祖先是 2, 因为根据定义最近公共祖先节点可以为节点本身。给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。空间复杂度方面,迭代实现的空间复杂度为。节点 2 和节点 8 的最近公共祖先是 6。,递归实现的空间复杂度为。

qq_42889517的博客 747

求两个节点的最近公共祖先多种解法&&判断一个节点是否在二叉树中

#pragma once #include <iostream> #include <cassert> #include <stack> #include <vector> using namespace std;template <typename T> struct TreeNode { T _data; //节点的数据 TreeNode<T>* _l

snow_5288的博客 911

Win10 Rational Rose 安装教程

在此教程中我们需要四个文件,点此下载[提取码:ig33] 其中第一个为2007的安装包,第二个为破解文件 前言 很多小伙伴反应说会出现几天后就到期的问题,包括我也出现了该问题,如果你已在其他地方安装好了文件且破解成功,且但几天后到期,如果可以使用更改时间的方式打开,那么可以跳过接下来的教程,直接看第三节,我们采用批处理的形式一键完成从修改时间到打开最后改回来的方法解决此问题 一、安装软件 解压缩两个安装包,进入 Rational Rose文件夹 选择setup.exe开始安装 按照图示依次点击

CoderJiang 2万+

查找两个节点最近的公共祖先

查找一个普通二叉树中两个节点最近的公共祖先。 方法: 1.分别找出两个节点距离根节点的路径并保存在栈中; 2.判断两个栈的长度是否相等,如果不相等,就pop()掉size()值较大的一个直到两个栈的长度相等。 3.分别取两个栈顶的元素,比较值是否相等,若不相等将两个栈顶元素都出栈 ,若相等,则返回栈顶元素。Node* FindCommonAncestorNode(Node* first, N

dong18292000671的博客 2966

ESP32S3编译micropython固件

编译ESP32芯片的micropython固件

m0_73253860的博客 2555

Quartus Prime 软件 USB-blaster 驱动安装失败【已解决】

一、安装步骤 1、将FPGA 开发板插入电脑时,未安装驱动的电脑会提示安装usb-Blaster驱动。Windows搜索框打开设备管理器,在“其他设备”下会发现黄色感叹号的“USB-Blaster”的设备驱动。 2、Quartus系列软件的安装目录下自带USB-blaster的驱动程序,右键更新驱动,选择驱动目录:(D:\intelFPGA\18.1\quartus\drivers\usb-blaster,文件位置和版本请按照自己安装的路径选择),点击Next开始安装。 3、安装成功,重启电脑即可使

adolphwang_909086的博客 6万+

求二叉树中两个节点的最近公共祖先

要求考虑以下三种种情况,给出解决方案,并解决: 1:二叉树每个节点有parent(三叉链) 2:二叉树是搜索二叉树。 3:就是普通二叉树。(尽可能实现时间复杂度为O(N))

weixin_35140291的博客 878

SAP ABAP 四种传统的数据库视图类型介绍之二:Projection View

一是该 projection view 只暴露了底层 TADIR 表的四个字段,因此通过该 view 维护数据,在维护界面我们只能维护一条记录的四个字段,如下图所示。使用 Projection view 的优点在于其设计灵活性:如果系统中原始的数据库表字段较多,通过投影仅保留关键信息可有效降低从数据库层到应用层之间的数据传输负担,且保持数据的一致性。其二是笔者之前的文章提到,TADIR 是 ABAP 系统重要的对象注册表,如同 window 操作系统的注册表一样,一般的应用开发人员不应该去修改其内容。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1441

【leetcode/二叉树】二叉树的最近公共祖先(递归+找节点路径)

问题描述: 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。” 例如,给定如下二叉树: root =[3,5,1,6,2,0,8,null,null,7,4] 示例 1: 输入:...

qq_43338695的博客 842

Python爬虫终极指南:异步爬虫+Playwright逆向,高效爬取携程旅游数据

Playwright解决动态渲染和加密参数难题,模拟真实浏览器环境;aiohttp异步提升抓取效率,结合代理池和并发控制规避风控;指纹伪装、行为模拟等技巧大幅降低被检测概率。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 2951

控制科学与工程(自动化)保研经验【4】——浙大篇

控制科学与工程(自动化)保研经验【4】——浙大篇

Control Everything 1万+

LeetCode C++ 面试题68 - II. 二叉树的最近公共祖先【Tree】简单

给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p 、q ,最近公共祖先表示为一个结点 x ,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。” 例如,给定如下二叉树: root = [3,5,1,6,2,0,8,null,null,7,4] 示例 1: 输入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1 输出: 3 解释: 节点 5 和节点

memcpy0的博客 383

【云原生技术】K8s 在拉取镜像时报错tls: failed to verify certificate: x509: certificate signed by unknown authority

原因 Kubernetes 节点在拉取镜像时会对 Harbor 的 HTTPS 证书做严格校验; 日志里的核心报错是: ``` tls: failed to verify certificate: x509: certificate signed by unknown authority ``` 说明 Harbor 返回的服务器证书要么是自签发,要么缺少在系统信任链里的根/中级 CA,节点因此拒绝连接。 你需要让 **所有负责拉镜像的节点(containerd 或 Docker 守护进程)

weixin_46453070的博客 2876

【Python】【难度:简单】Leetcode 面试题68 - II. 二叉树的最近公共祖先

给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。” 例如,给定如下二叉树:root =[3,5,1,6,2,0,8,null,null,7,4] 示例 1: 输入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1 输出: 3 解释: 节点...

thomashhs12的博客 538

基于ArduPilot的旋翼式无人机飞行器开发系列(二,学习路线)

一,热爱 作为一名耿直的技术男,在这里我只想说一句,热爱是可持续学习的第一要素,也只有热爱才能让你坚持到最后。 至于最后能得到什么,只有你自己知道。常说书中自有颜如玉,书中自有黄金屋。如果你是为了颜如玉,我相信大多数颜如玉做不了你的红颜知己。如果是为了黄金屋,当你持续投入时间和金钱却看不到回报的时候,相信退堂鼓早已隆隆作响。 我给自己的信条就是为当下努力工作,为将来持续学习。当前飞控行业并没有爆发,如果想赚块钱,去互联网汽车,去VR/AR吧,去元宇宙吧。 那么我热爱...

从0到1,突破自己 1674

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

**剑指offer面试题68 - II. 二叉树的最近公共祖先**

剑指offer面试题68 - II. 二叉树的最近公共祖先 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。” 例如,给定如下二叉树: root = [3,5,1,6,2,0,8,null,null,7,4] 示例 1: 输入: root = [3,5,1,6,2,0,8,null,null,7,4], p =

qq_45080642的博客 8974

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

刷题记录——LeetCode:面试题68 - II. 二叉树的最近公共祖先

LeetCode:面试题68 - II. 二叉树的最近公共祖先 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。” 例如,给定如下二叉树: root = [3,5,1,6,2,0,8,null,null...

weixin_45405425的博客 283

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Leetcode 236-二叉树的最近公共祖先

同剑指offer 68-II 二叉树的最近公共祖先/lcr 194。

Helene1996的博客 1265

Leetcode 面试题68 - II. 二叉树的最近公共祖先【递归&非递归】

文章目录问题描述解题报告递归非递归实现代码递归非递归参考资料 问题描述 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。” 例如,给定如下二叉树: root = [3,5,1,6,2,0,8,null,...

MD 1458

leetcode面试题68 - II 二叉树的最近公共祖先

面试题68 - II 二叉树的最近公共祖先 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。” 思路 与二叉搜索树的最近公共祖先相比,少了一个有序的条件,可以在左右子树查找p和q,然后返回。 /** *...

莫,莫,莫! 395

面试题68 - II. 二叉树的最近公共祖先

面试题68 - II. 二叉树的最近公共祖先 【简单题】【递归】 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)” 例如,给定如下二叉树: root = [3,5,1,6,2,0,8,null,nu...

算法岗从零到无穷 219

剑指 Offer 68 - II. 二叉树的最近公共祖先

题目: 剑指 Offer 68 - II. 二叉树的最近公共祖先 题解: 代码: 该题代码无法进行测试。(LeetCode后台对 “结点相等” 已进行处理) 1. 疑难点一: 2. 疑难点二: public class 面试题68_2 { public static TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) { if(root == null) // 当越过叶节点,则直

dev_zyx的博客 746

剑指offer 68-II 二叉树的最近公共祖先

题目描述 题目转载自LeetCode 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。” 例如,给定如下二叉树: root = [3,5,1,6,2,0,8,null,null,7,4] 示例 1: ...

Helene1996的博客 261

二叉树找到两个结点的最近公共祖先

面试题68 - I. 二叉搜索树的最近公共祖先 https://leetcode-cn.com/problems/er-cha-sou-suo-shu-de-zui-jin-gong-gong-zu-xian-lcof/ 题目描述: 思路: 这是一个二叉搜索树,根节点左边的数都小于根节点,根节点右边的数都大于根节点。 如果两个结点的值都小于根节点的值,两个结点一定都在树的左边。都大于根节点的...

Mason97的博客 1031

LeetCode:面试题68 - II. 二叉树的最近公共祖先(C语言)

题目描述: 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。” 例如,给定如下二叉树: root = [3,5,1,6,2,0,8,null,null,7,4] 示例 1: 输入: root = [3...

C/C++攻城狮 1077

剑指offer | 面试题68 - II. 二叉树的最近公共祖先

转载本文章请标明作者和出处 本文出自《Darwin的程序空间》 本文题目和部分解题思路来源自《剑指offer》第二版 开始行动,你已经成功一半了,献给正在奋斗的我们 题目 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也...

程序员大航子 587
上一篇: 【简单】235. 二叉搜索树的最近公共祖先(三种方法实现:后序遍历的非递归法实现+递归+迭代)
下一篇: 【简单】922. 按奇偶排序数组 II
菜菜2022
博客等级 码龄9年 67粉丝 1033原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值