首页 > 其他分享 >代码随想录——26、二叉(搜索)树的最近公共祖先

代码随想录——26、二叉(搜索)树的最近公共祖先

时间:2024-11-26 10:46:03浏览次数:6  
标签:26 right return val nullptr 随想录 二叉 TreeNode root

image
image

递归

最近公共祖先定义:设节点 root 为节点 p,q 的某公共祖先,若其左子节点 root.left 和右子节点root.right 都不是 p,q 的公共祖先,则称 root 是“最近的公共祖先”。

若 root是 p,q的 最近公共祖先 ,则只可能为以下情况之一

  1. 如果p和q在节点root的两侧,那么root就是最近公共祖先
  2. p = root ,且 q 在 root 的左或右子树中
  3. q = root ,且 p 在 root 的左或右子树中

具体解法

  1. 回溯:如果遇到p,q就返回p,q;如果是空节点返回null;如果左右子树不为空则返回当前节点

二叉树只能通过后序遍历(即:回溯)实现从底向上的遍历方式。

  1. 要理解如果返回值left为空,right不为空为什么要返回right,为什么可以用返回right传给上一层结果image

代码

class Solution {
public:
    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        if(root == nullptr)return nullptr;
        if(p == root || q == root)return root;
        TreeNode* left = lowestCommonAncestor(root->left,p,q);
        TreeNode* right = lowestCommonAncestor(root->right,p,q);
        if(left != nullptr && right != nullptr)return root;
        if(left != nullptr)return left;
        if(right != nullptr)return right;
        return nullptr;
    }
};

二叉搜索树

class Solution {
public:
    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        // 利用二叉搜索树特性:公共祖先的val一定在p和q的val之间,从上至下递归/搜索找到的第一个满足[p->val,q->val]的就是最近公共祖先
        // 1. 递归法
        if(root == nullptr)return nullptr;
        if(root->val < p->val && root->val < q->val){//小于p和q——cur,p,q / cur,q,p 则访问右子树
            return lowestCommonAncestor(root->right,p,q);
        }if(root->val > p->val && root->val > q->val){
            return lowestCommonAncestor(root->left,p,q);
        }
        return root;//在[p->val,q->val]左闭右闭区间,直接返回

        //2. 迭代法
        //利用二叉搜索树自带方向性
        while(root){
            if(root->val < p->val && root->val < q->val){//小于p和q——cur,p,q / cur,q,p 则访问右子树
                root = root->right;
            }else if(root->val > p->val && root->val > q->val){
                root = root->left;
            }else return root;
        }
        return NULL;

    }
};

标签:26,right,return,val,nullptr,随想录,二叉,TreeNode,root
From: https://www.cnblogs.com/neromegumi/p/18569632

相关文章

  • 【SPSS 26 软件下载与安装教程】
    1、安装包 SPSS26:下载地址 2、安装教程1)       解压下载安装包,点击setup.exe可执行文件  2)        弹窗安装对话框,选择安装IBMSPSS26  3)        读取安装进度条,选择下一步  4)        选择我接受,点击下一步  ......
  • 104. 二叉树的最大深度
    问题描述给定一个二叉树root,返回其最大深度。二叉树的最大深度是指从根节点到最远叶子节点的最长路径上的节点数。可以使用dfs和bfs两种方法针对树的层数进行遍历,并记录。递归方法可以用递归解决,比较简单,用递归函数的返回值承载答案,x表示从当前层到最深层的深度。classSo......
  • 94. 二叉树的中序遍历
    问题描述给定root,返回中序遍历,答案格式:classSolution{public:vector<int>inorderTraversal(TreeNode*root){}};则:将vector作为static或者全局变量,可以在该函数中实现递归;写另外一个函数专门用来递归;法一、使用另外的递归函数classSolution{......
  • COMP2611: Computer Organization
    COMP2611:ComputerOrganizationFall2024ProgrammingProject:AircraftWar(Deadline11:55pm,Dec1,SundayviaCanvas)Copyright:Allprojectrelatedmaterials(thisprojectdescription,modifiedMARS,projectskeleton)isforpersonalusageofstudent......
  • 代码随想录算法训练营day55 day57| 108.冗余连接 109.冗余连接II 53.寻宝
    学习资料:https://www.programmercarl.com/kamacoder/0108.冗余连接.html#思路图论并查集prim算法kruskal算法学习记录:108.冗余连接点击查看代码#并查集解法classUnionFind:def__init__(self,size):self.parent=list(range(size+1))deffind(se......
  • 代码随想录算法训练营第十二天|二叉树理论基础|二叉树的递归遍历|二叉树的迭代遍历|二
    二叉树的理论基础二叉树的主要形式:        二叉树有两种主要的形式:满二叉树和完全二叉树;    满二叉树:如果一棵二叉树只有度为0的结点和度为2的结点,并且度为0的结点在同一层上,则这棵二叉树为满二叉树。可以说深度为k,有2^k-1个节点的二叉树。       ......
  • CS61B 二叉搜索树的改进:B 树 笔记
    CS61B二叉搜索树的改进:B树笔记笔记的来源:CS61B-2024春季的课程课程主要内容:数据结构与算法分析课程运用语言:Java你可以在我的笔记网站里获得更多有用的资源。这个课有6个Homework,10个Lab,9个Project。其中第一个project是一个完整的2024游戏的实现,很......
  • H5流媒体播放器EasyPlayer.js网页直播/点播播放器如果H.265视频在播放器上播放不流畅,
    随着流媒体技术的迅速发展,H5流媒体播放器已成为现代网络视频播放的重要工具。其中,EasyPlayer.js网页直播/点播播放器作为一款功能强大的H5播放器,凭借其全面的协议支持、多种解码方式以及跨平台兼容性,赢得了广泛的关注和应用。如果H.265视频在播放器上播放不流畅,可以考虑以下几种......
  • Qt/C++音视频开发-保存裸流加入sps/pps信息/支持264/265裸流/转码保存/拉流推流
    Qt/C++音视频开发-保存裸流加入sps/pps信息/支持264/265裸流/转码保存/拉流推流介绍在音视频开发中,保存原始数据流(裸流)时,需要将编解码器的参数集(如H.264/H.265中的SPS和PPS)一同保存。这些参数集包含了解码所需的关键信息。本文将介绍如何在Qt/C++环境下实现这一功能,并支持......
  • 98.验证二叉搜索树 Golang实现「自顶向下」
    题目描述:给你一个二叉树的根节点root,判断其是否是一个有效的二叉搜索树。有效二叉搜索树定义如下:节点的左子树只包含小于当前节点的数。节点的右子树只包含大于当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。输入:root=[5,1,4,null,null,3,6]输出:fa......