首页 > 其他分享 >236.二叉树的最近公共祖先

236.二叉树的最近公共祖先

时间:2024-12-02 22:58:30浏览次数:9  
标签:node TreeNode temp 祖先 二叉树 236 节点 mp

题目:

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

百度百科中最近公共祖先的定义为:“对于有根树 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 。因为根据定义最近公共祖先节点可以为节点本身。
 

提示:

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

求解过程:

首先通过队列queue遍历一遍二叉树,在遍历过程中将每个子节点的父节点通过map存储起来。然后用一个map容器temp存储两个目标子节点,每次遍历目标子节点的父节点(可以通过最开始创建的map容器找到),并查看是否在temp中存在,若存在则说明该节点就是两个目标子节点的最近公共祖先节点,若不存在,将父节点存入temp容器中,将该父节点作为下一次循环的子节点继续寻找。

代码实现:

class Solution {
public:
    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        queue<TreeNode*> que;
        que.push(root);
        map<TreeNode*,TreeNode*> mp;//key为子节点,vlaue为父节点
        TreeNode* result;
        while(!que.empty()){//遍历二叉树,将每个节点的父节点存入到mp中
            TreeNode* node=que.front();
            que.pop();
            if(node->left){
                que.push(node->left);
                mp[node->left]=node;
            }
            if(node->right){
                que.push(node->right);
                mp[node->right]=node;
            }
        }
        map<TreeNode*,int> temp;//用于记录两个目标子节点往上遍历的父节点
        temp[p]=1;//将目标子节点存入temp中防止目标子节点就是另一个目标子节点的父节点
        temp[q]=1;
        TreeNode* t1=p;
        TreeNode* t2=q;
        while((mp.find(t1)!=mp.end())||(mp.find(t2)!=mp.end())){//以两个目标子节点往上遍历父节点,直到找到最近公共祖先
            TreeNode* t3=mp[t1];//记录父节点
            TreeNode* t4=mp[t2];
            if(t3!=NULL){//要提前判断父节点是否为空,防止错误记录
                if(temp.find(t3)!=temp.end()){//查看往上遍历过程中是否已经存储过该节点,存储过者说明该节点就是最近公共祖先
                    result=t3;
                    break;
                }
                else{//如不是更新子节点,将其父节点作为子节点往上遍历
                    temp[t3]=1;
                    t1=t3;
                }
            }
            if(t4!=NULL){
                if(temp.find(t4)!=temp.end()){
                    result=t4;
                    break;
                }
                else{
                    temp[t4]=1;
                    t2=t4;
                }
            }
            }
        return result;
    }
};

标签:node,TreeNode,temp,祖先,二叉树,236,节点,mp
From: https://blog.csdn.net/2401_84164461/article/details/144200159

相关文章

  • 博主自留二叉树万字长文—>涵盖名词辨析 + 树的两种表示方法 + 所有特殊二叉树 + 图解
    玩转二叉树(概念+图解+例题代码详解)一、树的概念我们知道在计算机什么是树吗?是二月春风似剪刀吗?哈哈哈哈哈哈显然不是我们看下面这张图,可以观察到树的一些特征1、树的特征(1)树是非线性的数据结构,是递归定义的(连通性)(2)子树之间不能有任何交集(无环性)(3)一颗N......
  • 二叉树の节点x的双亲节点
    算法思想:通过一个栈来辅助非递归地遍历二叉树。先向左遍历二叉树,将经过的节点依次入栈,并标记其tag为0(表示左孩子未遍历完),直到找到目标节点或者左子树为空。若找到目标节点,就输出栈顶节点的数据作为父节点并返回。若未找到且栈顶节点的右子树已遍历(tag为1),则弹出栈顶节点。若栈......
  • 数据结构(7)—二叉树_堆专题
    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言一、二叉树概念二、堆的插入与删除1.插入-Up向上调整2.删除-Down向下调整堆排序前言堆(Heap)是一种特殊的树形数据结构,通常用于实现优先队列。堆可以是二叉堆,也可以推广到k元堆,但最常见......
  • 完全二叉树的应用--堆
    目录1.堆的概念2.性质3.逻辑结构和物理结构(存储结构)4.堆的实现前提5.堆的实现思考:插入数据之前,得保证之前的数据是一个堆。为什么要这样?思考:为什么先改变child的值,先改parent的值不可以么? 5.2向下调整建堆思考:为什么先动parent,后动child?1.堆的概念如果有一个......
  • 代码随想录算法训练营第十四天 | 226.翻转二叉树、 101. 对称二叉树、104.二叉树的最
    文档讲解:代码随想录视频讲解:代码随想录状态:完成4道题226.翻转二叉树整体思路:交换每一个节点的左右孩子思考:使用哪种遍历方式?建议使用前序或后序遍历(中序遍历比较绕)​前序遍历#Definitionforabinarytreenode.#classTreeNode:#def__init__(self,va......
  • 数据结构第一弹-二叉树
    大家好,今天和大家一起分享一下数据结构中的二叉树~二叉树是一种非常基础且重要的非线性数据结构,广泛应用于各种算法和系统设计中。今天详细介绍二叉树的基本概念、性质以及操作方法,并特别展开讨论一种特殊的二叉树——二叉搜索树(BinarySearchTree,BST)一、二叉树概述二......
  • 102. 二叉树的层序遍历
    问题描述给你二叉树的根节点root,返回其节点值的层序遍历。(即逐层地,从左到右访问所有节点)。分析对于nullptr:先判不空再入队入队列后在for中判空,为空则continue第一种更好,因为如果为空,即使continue也会影响全局,比如该题中res.push_back(layer_res);当某层结点为空,则lay......
  • 二叉树的遍历方式详解及代码示例
    二叉树的遍历方式详解及代码示例二叉树的遍历方式详解及代码示例摘要引言1.二叉树的前序遍历(Pre-orderTraversal)1.1前序遍历的定义1.2前序遍历的代码示例输出:2.二叉树的中序遍历(In-orderTraversal)2.1中序遍历的定义2.2中序遍历的代码示例输出:3.二叉树的后......
  • 链式二叉树
    引言在探讨数据结构时,我们不难发现,虽然普通的链式二叉树在存储数据上可能不如前面用数组模拟二叉树直观,但其独特的结构为后续的复杂数据结构奠定了基础。特别是当我们谈及搜索问题时,搜索二叉树以其高效的搜索性能脱颖而出,与二分查找法有着异曲同工之妙。但是,二分查找法在实际......
  • 二叉树的层序遍历
    给你二叉树的根节点root,返回其节点值的层序遍历。(即逐层地,从左到右访问所有节点)。示例输入:root=[3,9,20,null,null,15,7]输出:[[3],[9,20],[15,7]]思路:求解该问题需要使用到队列进行层序遍历,即从根节点开始一层一层的开始遍历,每一次遍历都先确定队列中结点的个数n,用......