【简单】235. 二叉搜索树的最近公共祖先(三种方法实现:后序遍历的非递归法实现+递归+迭代)

GO实现构建完全二叉树并实现层次、先序、中序、后序遍历的递归和非递归算法 一、树及节点定义 /* 树 */ type Tree struct { rootNode *TreeNode // 根节点确定一棵树 } /* 树节点 */ type TreeNode struct { nodeValue int32 Parent *TreeNode // 父节点,根节点没有 LNode *TreeNode // 左子节点 RNode *TreeNode ... 阅读详情

【题目】
给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。“
来源:leetcode
链接:
【示例】
输入: root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q = 8
输出: 6
解释: 节点 2 和节点 8 的最近公共祖先是 6
【示例2】
输入: root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q = 4
输出: 2
解释: 节点 2 和节点 4 的最近公共祖先是 2, 因为根据定义最近公共祖先节点可以为节点本身
【代码】 后序遍历的非递归法寻找祖先节点

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

【递归法】

class Solution {
public:
    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        if(root->val<p->val&&root->val<q->val)
            return lowestCommonAncestor(root->right,p,q);
        else if(root->val>q->val&&root->val>p->val)
            return lowestCommonAncestor(root->left,p,q);
        else
            return root;
    }
};

【迭代法】

class Solution {
public:
    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        if(root->val<p->val&&root->val<q->val)
            return lowestCommonAncestor(root->right,p,q);
        else if(root->val>q->val&&root->val>p->val)
            return lowestCommonAncestor(root->left,p,q);
        else
            return root;
    }
};
LeetCode 0235.二叉搜索树的最近公共祖先【Go】 LeetCode 0235.二叉搜索树的最近公共祖先 阅读详情

相关推荐

【数据结构】(二叉树)求二叉树中两个节点的最近公共祖先节点 递归&&非递归

递归

你好丶下一秒 1万+

ORBSLAM3运行记录(单目+IMU)

ORBSLAM3运行记录1.单目+IMU数据集运行记录自己做的其它测试2.单目+IMU自己采集数据运行记录测试结果 1.单目+IMU数据集运行记录 ORBSLAM3没有预留ROS下单目+IMU的结点,这个需要自己去写代码添加,可以参考这篇博客,《ORBSLAM3 用ROS接口运行双目IMU和单目IMU模式》。我的ROS结点为Mono-IMU,字典文件ORBvoc.txt在ORBSLAM3 / Vocabulary文件夹中,配置文件EuRoC.yaml在ORB_SLAM3 / Examples / Monoc

yys2324826380的博客 1万+

【数据结构】二叉树的非递归遍历与最近公共祖先

2.因为获取栈内节点的右节点时没有将栈内节点出栈,故当遍历完该节点的右节点后才会轮到该节点出栈,此时若该节点的右节点不为空,就需要判断该节点的右节点是否被打印过了,不然就会再遍历一遍该节点的右边。如上图所示,先遍历根节点和其左子树,将遍历到的节点入栈,之后再取出栈内的节点遍历其右子树。D,C的最近公共祖先是A;E,F的最近公共祖先是B。1.因为根节点是最后打印的,故获取栈内节点的右节点时并不能将栈内的节点出栈。我们一般使用递归遍历二叉树,但借助栈我们也可以通过非递归遍历二叉树。二叉树的最近公共祖先。

qq_61872165的博客 743

大数据工程中的多模态数据处理技术

模态”(Modality)指的是数据的表现形式文本(Text):新闻、评论、文案等;图像(Image):照片、截图、医学影像等;音频(Audio):语音、音乐、环境声音等;视频(Video):短视频、监控视频、电影等(本质是图像+音频的组合);数值/结构化数据(Numerical/Structured):用户年龄、商品价格、传感器数据等;时间序列(Time Series):股票价格、物流轨迹、心率数据等。多模态数据(Multimodal Data)是指包含两种或以上模态的数据集。

AI云原生与云计算技术学院 1277

【ESP32设备通信】-LoRa通信

在本文中,我们将使用 Arduino IDE 将 ESP32 与 LoRa SX1278 (Ra-02) 模块连接起来。 我们将创建一个真实的示例项目,通过 LoRa 无线打开/关闭 LED 进行演示。

视觉与物联智能 1891

(19)Go队列思想实现二叉树的非递归前序和层次遍历

leetcode-144 // 用非递归法实现前序遍历,借用go自带的list实现栈的效果 // go自带的list,推进去的值被包装在element结构里面,element.Value为推进去的值 func preorderTraversal(root *TreeNode) []int { if root == nil { return nil } resp := []int{}...

哥斯拉啊啊啊哦的博客 331

【WRF湿度调整策略】WRF/ERA5湿度数据对比

【WRF湿度调整策略】WRF/ERA5湿度数据对比

WW、forever的博客 121

leetcode算法专题训练:五.树专题

五.树专题 144.二叉树的前序遍历 94.二叉树的中序遍历 145.二叉树的后序遍历 102.二叉树的层序遍历 107.二叉树的层次遍历2 103.二叉树的锯齿形层次遍历 100.相同的树 101.对称二叉树 226. 翻转二叉树 剑指 Offer 26. 树的子结构 110.平衡二叉树 111.二叉树的最小深度 104.二叉树的最大深度 114.二叉树展开为链表 116.充填每个节点的下一个右侧节点指针 117.充填每个节点的下一个右侧节点指针2 105.从前序与中序遍历序列构造二叉树 106.从中.

Worthy_Wang的博客 1420

用 MATLAB 实现鼻子和嘴的检测

为了方便起见,这里我们使用了 CascadeObjectDetector 中自带的 haarcascade_frontalface_alt2.xml 文件,该文件包含了多个包含鼻子和嘴的样本图像。其中 bbox 变量表示检测到的所有鼻子和嘴的边界框信息。在图像处理中,鼻子和嘴的检测是十分重要的一项任务。本文将介绍如何使用 MATLAB 实现鼻子和嘴的检测,并提供相应的源代码。然后,我们可以调用之前创建的 detector 对象来进行鼻子和嘴的检测。综上所述,我们可以使用以上代码实现鼻子和嘴的检测。

qq_39605374的博客 256

2026年VIVO嵌入式岗位高频面试题(含参考答案)

摘要:VIVO嵌入式岗位考核涵盖智能手机、IoT设备、芯片适配等方向,重点考察硬件底层交互、RTOS/Linux开发、C/C++功底与问题排查能力。题目按优先级排序,分硬件架构、RTOS、C/C++、数据结构、Linux实践、行业认知6大模块,共40道题。硬件部分涉及中断、ARM架构、加速技术、BSP开发等;RTOS部分区分硬/软实时系统;C/C++部分侧重内存管理、位操作;Linux部分考察常用命令;行业部分关注鸿蒙等系统理念。题目设计贴合实际工作场景,全面评估嵌入式开发能力。

Open 52

二叉树的最近公共祖先

二叉树的最近公共祖先 力扣官方题解发布于3 天前13.1k官方C++GoJavaJavaScript树递归 方法一:递归 思路和算法 我们递归遍历整棵二叉树,定义f_xfx​表示xx节点的子树中是否包含pp节点或qq节点,如果包含为true,否则为false。那么符合条件的最近公共祖先xx一定满足如下条件: (f_{\text{lson}}\ \&\&\ f_{\text{rson}})\ ||\ ((x\ =\ p\ ||\ x\ =\ q)\ \&am...

cxu123321的博客 404

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

二叉树树的前,中,后序遍历非递归--go语言实现

递归遍历二叉树非常简单,只要交换调用顺序即可,那么非递归呢,我这里都是借用栈的思想实现的 前序遍历 实现:第一次访问的时候就记录到结果数组中,然后进栈,依次访问其左孩子,知道左孩子为空弹出栈顶,访问其右孩子,循环这个过程,直到栈为空,root也为空 代码: func (root *TreeNode) preorder() []int{ //非递归前序遍历 res:=[]int{} ...

LYue123的博客 2269

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

用非递归实现二叉树的前序中序后序遍历

二叉树的遍历是指按某条搜索路径访问树中的每个结点,使得每个结点均被访问一次,而且仅能访问一次(说明不可二次访问,一遍而过)。遍历一颗二叉树便要决定对根结点N、左子树L和右子树的访问顺序。二叉树常的的遍历方法有前序遍历(NLR)、中序遍历(LNR)和后序遍历(LRN)三种遍历算法,其中 “序” 指的是根结点在何时被访问。三种遍历方法有递归和非递归两个版本。在本文中主要用非递归的方式去实现二叉树的非递归遍历。用非递归的方法去进行前序,中序,后序的遍历是对二叉树遍历的过程更深入的了解。最后除了。

Xc的博客 1471

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

牛客BM38 在二叉树中找到两个节点的最近公共祖先

在二叉树中找到两个节点的最近公共祖先。

qq_45849148的博客 649

NowCoder——查找二叉树中任意两个节点的最近公共祖先

#include<stdio.h> #include<stdlib.h> typedef int ElemType; typedef struct BiTNode { ElemType data; struct BiTNode *lchild; struct BiTNode *rchild; }BiTNode,*BiTree; void Crea...

weixin_42976216的博客 280

利用二叉树的非递归后序遍历求解最近公共祖先问题

通过上一篇的博客我们知道,可以利用栈来实现二叉树的后序遍历。其实这里有一个性质,就是当使用非递归后序遍历时,栈中的元素就是当前节点到根节点的路径。利用这个规律,我们就可以求解最近公共最先问题了。 算法 找出两个节点各自到根节点的路径。这里利用非递归后序遍历二叉树,既可以找到两个节点到根节点的路径。 根据路径找出最近的公共祖先。首先根节点肯定是他们的祖先,可以从跟节点开始查找,直到最后一个相同的树节点

Ajay666的博客 3191

在二叉树中找到两个节点的最近公共祖先

在二叉树中找到两个节点的最近公共祖先 描述 给定一棵二叉树(保证非空)以及这棵树上的两个节点对应的val值 o1 和 o2,请找到 o1 和 o2 的最近公共祖先节点。 数据范围:1≤n≤1000,树上每个节点的val满足0<val≤100 要求:时间复杂度 O(n) 注:本题保证二叉树中每个节点的val值均不相同。 如当输入[3,5,1,6,2,0,8,#,#,7,4],5,1时,二叉树{3,5,1,6,2,0,8,#,#,7,4}如下图所示: 所以节点值为5和节点值为1的节点的最近公共祖先节点的节

Mwwwwwwww的博客 1776

面试经典算法系列之二叉树11 -- 二叉搜索树的最近公共祖先

公众号:阿Q技术站。

qq_44630255的博客 602

二叉树(12)----查找两个节点最低祖先节点(或最近公共父节点等),递归和非递归

1、二叉树定义: typedef struct BTreeNodeElement_t_ { void *data; } BTreeNodeElement_t; typedef struct BTreeNode_t_ { BTreeNodeElement_t *m_pElemt; struct BTreeNode_t_ *m_pLeft; stru

录事参军 1万+

C语言实现找到二叉树p和q的最近公共祖先结点

C语言实现找到二叉树p和q的最近公共祖先结点

呵呵哒!的博客 1651

二叉搜索树的最近公共祖先——递归/非递归

二叉搜索树的最近公共祖先——递归/非递归

weixin_45594172的博客 1049

后序遍历非递归求结点的所有祖先(或求两个节点的最近公共祖先)

#include "stdafx.h" #include&lt;cstdio&gt; #include&lt;iostream&gt; #include&lt;vector&gt; #include&lt;stack&gt; using namespace std; const int maxn=100; struct node{ int data; int tag; node*l,*r;...

qq_30339595的博客 2564

树(二叉链表,非递归)两结点的最近公共祖先结点

/* 二叉链表非递归 查找两个结点的最近公共结点 思路: 把一个结点的全部父结点都放到栈中(类似于查找从根结点到某一结点的路径) 依次出栈判断这棵树的后代中是否包括另一个结点 */ #include <iostream> #include <cstdlib> using namespace std; const int maxsize = 100; typedef struct BiTNode{ char data; struct BiTNode *lchild, *rc

qq_40659154的博客 383

第4章第1节练习题11 查找最近公共祖先节点

假设指针p和指针q分别指向二叉树中任意两个节点的指针,试编写算法找到p和q的最近公共祖先节点r

法海你懂不? 1912
上一篇: 【简单】面试题 17.10. 主要元素(摩尔投票法/多数投票法)
下一篇: 【简单】面试题68 - II. 二叉树的最近公共祖先
菜菜2022
博客等级 码龄9年 67粉丝 1033原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值