( “树” 之 BST) 235. 二叉搜索树的最近公共祖先 ——【Leetcode每日一题】

news2024/11/16 12:40:17

二叉查找树(BST):根节点大于等于左子树所有节点,小于等于右子树所有节点。
二叉查找树中序遍历有序。

235. 二叉搜索树的最近公共祖先

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

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

例如,给定如下二叉搜索树: root = [6,2,8,0,4,7,9,null,null,3,5]

在这里插入图片描述

示例 1:

输入: 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, 因为根据定义最近公共祖先节点可以为节点本身。

说明:

  • 所有节点的值都是唯一的。
  • pq 为不同节点且均存在于给定的二叉搜索树中。

思路:

法一:递归法二:迭代

由于二叉查找树中序遍历有序,节点pq ,则对根节点root有三种情况:

  1. 如果节点pq的值都小于根节点root的值,则最近的公共祖先一定在该root的左边;
  2. 如果节点pq的值都大于根节点root的值,则最近的公共祖先一定在该root的右边;
  3. 否则,当前根节点root就是最近的公共祖先;

代码:(Java、C++)

法一:递归
Java

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */

class Solution {
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        if(root == null) return null;
        if(p.val < root.val && q.val < root.val) return lowestCommonAncestor(root.left, p, q);
        if(p.val > root.val && q.val > root.val) return lowestCommonAncestor(root.right, p, q);
        return root;
    }
}

C++

/**
 * 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 == nullptr) return nullptr;
        if(p->val < root->val && q->val < root->val) return lowestCommonAncestor(root->left, p, q);
        if(p->val > root->val && q->val > root->val) return lowestCommonAncestor(root->right, p, q);
        return root;
    }
};

法二:迭代
Java

class Solution {
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        while(root != null){
            if(p.val < root.val && q.val < root.val){
                root = root.left;
            } else if(p.val > root.val && q.val > root.val) {
                root = root.right;
            }else{
                return root;
            }
        }
        return root;
    }
}

C++

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

运行结果:

在这里插入图片描述

复杂度分析:

  • 时间复杂度 O ( n ) O(n) O(n),其中 n 是给定的二叉搜索树中的节点个数
  • 空间复杂度 O ( 1 ) O(1) O(1),迭代为 O ( 1 ) O(1) O(1);而递归过程中栈的开销为 O ( n ) O(n) O(n)

题目来源:力扣。

放弃一件事很容易,每天能坚持一件事一定很酷,一起每日一题吧!
关注我 leetCode专栏,每日更新!

注: 如有不足,欢迎指正!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/442611.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

考验大家指针功底的时候到了:请问如何理解 (int*)1 + 1 ?

来&#xff0c;猜猜看&#xff0c;这里的执行结果是什么&#xff1f; 这是今天课上的一道理解题&#xff0c;给大家一点点思考时间。 &#xff08;心里有答案了再往下滑哦&#xff09; 5 4 3 2 1 . 答案是&#xff0c;报warning&#xff01;因为%d不是用来输出指针的哈…

ntlm hash加密方式学习

文章目录 一、ntlm hash二、LM hash加密三 、NTLM Hash 加密 一、ntlm hash 什么是ntlm hash&#xff0c;当windows进行本地用户密码认证时不是以用户输入的明文密码与系统密码直接比较&#xff0c;而是经过某种方式加密之后进行比较。所以windows中的用户密码凭证不是以明文的…

哪个洗脱一体机好用?好用的洗拖一体机推荐

洗地机是一款使用非常方便的清洁工具&#xff0c;通常可以实现吸、拖、洗三个功能&#xff0c;对于各类家庭污渍都有着不错的处理能力&#xff0c;无论是干燥垃圾还是潮湿垃圾一律可以有效清理。不过很多新手朋友在选购洗地机时会因为看不懂参数而频繁踩雷。本文为大家整理了洗…

图像分割(Segmentation)

文章目录 图像分割FCNU-NetSegNetDeepLab图像分割常用数据集 图像分割 图像分割是预测图像中每一个像素所属的类别或者物体。基于深度学习的图像分割算法主要分为两类&#xff1a; 语义分割&#xff08;Semantic Segmentation&#xff09; 为图像中的每个像素分配一个类别。 …

基于Bert的知识库智能问答系统

项目完整地址&#xff1a; 可以先看一下Bert的介绍。 Bert简单介绍 一.系统流程介绍。 知识库是指存储大量有组织、有结构的知识和信息的仓库。这些知识和信息被存储为实体和实体关系的形式&#xff0c;通常用于支持智能问答系统。在一个知识库中&#xff0c;每个句子通常来说…

用Morss获取全文RSS摘要

什么是 Morss &#xff1f; Morss 工具的目标是从互联网上常见的 RSS 摘要中获取全文 RSS 摘要。Morss 能打开来自 RSS的链接&#xff0c;然后从网站下载整篇文章并将其放回 RSS 摘要中&#xff0c;还可以将摘要导出为 RSS/JSON/CSV/HTML。 Morss 需配合其他 RSS 阅读器使用&am…

人工智能AI图像风格迁移(StyleTransfer),基于双层ControlNet(Python3.10)

图像风格迁移&#xff08;Style Transfer&#xff09;是一种计算机视觉技术&#xff0c;旨在将一幅图像的风格应用到另一幅图像上&#xff0c;从而生成一幅新图像&#xff0c;该新图像结合了两幅原始图像的特点&#xff0c;目的是达到一种风格化叠加的效果&#xff0c;本次我们…

神经影像分析的统计学方法

线性模型概述 模型是对现实的一种数学近似&#xff0c;其中给定输入变量集的某个函数旨在重建一个输出变量。以fMRI范式为例&#xff0c;在这个范式中&#xff0c;给受试者呈现面孔和房屋的图像。该模型的目标是利用体素对面孔和房屋反应时的预期时间进程&#xff0c;并产生与…

基于html+css的图片展示20

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…

Mybatis(十)级联映射与懒加载

一、Mybatis的级联映射 使用Mybatis的级联映射&#xff0c;我们可以轻松的实现一对一、一对多或者多对多关联查询&#xff0c;甚至可以利用级联映射实现懒加载。 所谓的懒加载&#xff0c;就是我们在一个实体对象中关联了其他对象&#xff0c;如果不需要获取被关联的对象&…

什么样的测试才是优秀的测试

什么样的测试才是优秀的测试 优秀的测试应该包括以下要素&#xff1a; 测试代码的可读性和可维护性 代码在项目中及特定源代码中的组织方式 测试所检查的内容 测试的可靠性及可重复性 测试对测试替身的使用 可读的代码才是可维护的代码 代码较差的可读性与缺陷密度密切相…

GB 35114-2017 学习笔记

GB 35114-2017 学习笔记 第四章 公共安全视频监控联网信息安全系统互联结构 公共安全视频监控信息安全系统 公共安全视频监控信息安全系统由四部分组成&#xff1a; 具有安全功能的前端设备 FDWSF(安全前端设备:Front-end Device With Safety Function)具有安全功能的用户终…

Ubuntu18.04环境下安装igH EtherCAT Master

一、安装步骤 下载安装包 EtherCAT安装包&#xff1a;igH EtherCAT安装包&#xff08;目前最新的稳定版&#xff09; 安装依赖包 sudo apt install autoconf automake libtool net-tools解压EtherCAT安装包&#xff0c;进入解压出的文件夹&#xff0c;右键打开终端输入 ./b…

Spring IoC容器、IoC与DI

目录 Spring是什么&#xff1f; 理解容器 什么是IoC(Inversion of Control) 传统的new创建对象的方式中类与类的耦合程度很大。 IoC的优势&#xff1a; Spring IoC容器最核心的功能 什么是DI (Dependency Injection) IoC和DI的区别 Spring是什么&#xff1f; Spr…

145. 二叉树的后序遍历【34】

难度等级&#xff1a;容易 上一篇算法&#xff1a; 102. 二叉树的层序遍历【206】 力扣此题地址&#xff1a; 145. 二叉树的后序遍历 - 力扣&#xff08;Leetcode&#xff09; 1.题目&#xff1a;145. 二叉树的后序遍历 给你二叉树的根节点 root &#xff0c;返回它节点值的 后…

Django DRF - JWT Token认证使用

JWT Token认证使用 jwt官网&#xff1a;https://jwt.io/ 在用户注册或登录后&#xff0c;我们想记录用户的登录状态&#xff0c;或者为用户创建身份认证的凭证。我们不再使用Session认证机制&#xff0c;而使用Json Web Token认证机制。 一. JWT概念 Json web token (JWT),…

JavaScript—javaEE

文章目录 1.关于JavaScript2.引入的方式3.输入输出4.语法4.1变量4.2基本数据类型4.3运算符4.4数组4.5函数4.6对象 5.dom5.1获取元素5.2操作元素5.3表单控件5.4样式&#xff1a;style属性5.5模仿和服务端交互 6.ajax6.1概念6.2作用6.3Ajax代码6.4Ajax发get请求6.5Ajax发post请求…

【文件系统和系统日志分析】

目录 一、inode和block概述block&#xff08;块&#xff09;inode&#xff08;索引节点&#xff09; 二、inode内容三、inode的号码3.1、查看inode号码的方法 四、inode的大小磁盘分区后的结构访问文件的简单流程 五、删除乱码文件六、inode节点耗尽故障处理6.1、模拟inode节点…

【Tomcat】Tomcat的安装配置和在Idea中使用Tomcat:

文章目录 一、获取安装包二、配置环境三、验证是否配置成功【法一】通过运行tomcat文件夹下的bin文件夹中的 startup.bat【法二】快捷键【winr】&#xff0c;输入【cmd】&#xff0c;点击【确定】&#xff0c;输入 startup.bat 四、出现乱码和端口号被占用的解决方案【1】出现乱…

Spring概述,IOC,AOP使用

Spring简介 Spring概述 官网地址&#xff1a;https://spring.io/ Spring 是最受欢迎的企业级 Java 应用程序开发框架&#xff0c;数以百万的来自世界各地的开发人员使用Spring 框架来创建性能好、易于测试、可重用的代码。 Spring 框架是一个开源的 Java 平台&#xff0c;它最…