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

news2024/11/29 8:48:52

摘要

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

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

一、二叉搜索树的最近公共祖先

注意到题目中给出的是一棵二叉搜索树,因此我们可以快速地找出树中的某个节点以及从根节点到该节点的路径,例如我们需要找到节点 p:

  • 我们从根节点开始遍历;
  • 如果当前节点就是p,那么成功地找到了节点;
  • 如果当前节点的值大于p的值,说明p应该在当前节点的左子树,因此将当前节点移动到它的左子节点;
  • 如果当前节点的值小于p的值,说明p应该在当前节点的右子树,因此将当前节点移动到它的右子节点。

package Tree;

/**
 * @Classname JZ68二叉搜索树的最近公共祖先II
 * @Description TODO
 * @Date 2023/2/23 21:45
 * @Created by xjl
 */
public class JZ68二叉搜索树的最近公共祖先II {

    public class TreeNode {
      int val;
      TreeNode left;
      TreeNode right;
      TreeNode(int x) { val = x; }
  }

    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        int value=root.val;
        if (p.val<value && q.val<value){
            return lowestCommonAncestor(root.left,p,q);
        }
        if (p.val>value&&q.val>value){
            return lowestCommonAncestor(root.right,p,q);
        }
        if (root==q||root==q){
            return root;
        }
        return root;
    }
}

二、二叉树的最近公共祖先

祖先的定义: 若节点p在节点 root的左(右)子树中,或p=root ,则称 root是p的祖先。

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

根据以上定义,若 rootroot 是 p,q的 最近公共祖先 ,则只可能为以下情况之一:

  • p 和q在root的子树中,且分列root的异侧(即分别在左、右子树中);那p、q的公共祖先就是root。
  • p=root,且q在root 的左或右子树中;
  • q=root ,且p 在root 的左或右子树中;

考虑通过递归对二叉树进行先序遍历,当遇到节点p或q时返回。从底至顶回溯,当节点p,q在节点 root的异侧时,节点root即为最近公共祖先,则向上返回root 。

递归解析:

终止条件:

  • 当root节点为null,则直接返回 null;
  • 当root等于p,q,则直接返回root;

递推工作:

  • 开启递归左子节点,返回值记为 left;
  • 开启递归右子节点,返回值记为 right;

返回值: 根据left和right,可展开为四种情况;

  • 当left和right同时为空 :说明root的左 / 右子树中都不包含p,q,返回null; 
  • 当left和right同时不为空 :说明p,q分列在root的异侧 (分别在 左 / 右子树),因此 root为最近公共祖先,返回root;
  • 当 left为空,right不为空:p,q都不在root的左子树中,直接返回right 。具体可分为两种情况:
  •        p,q其中一个在root的右子树中,此时right指向P(假设为p);
  •        p,q两节点都在root的右子树中,此时right指向最近公共祖先节点 ;
package Tree;

/**
 * @Classname JZ68二叉树的最近公共祖先
 * @Description TODO
 * @Date 2023/2/23 17:58
 * @Created by xjl
 */
public class JZ68二叉树的最近公共祖先 {

    public class TreeNode {
        int val;
        TreeNode left;
        TreeNode right;

        TreeNode(int x) {
            val = x;
        }
    }

    /**
     * @description 二叉树的最近公共祖先
     * @param: root
     * @param: p
     * @param: q
     * @date: 2023/2/23 17:58
     * @return: Tree.JZ68二叉树的最近公共祖先.TreeNode
     * @author: xjl
     */
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        if (root==null||root==p||root==q){
            return root;
        }
        TreeNode left=lowestCommonAncestor(root.left,p,q);
        TreeNode right=lowestCommonAncestor(root.right,p,q);
        if (left==null){
            return right;
        }
        if (right==null){
            return left;
        }
        return root;
    }
}

博文参考

《leetcode》

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

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

相关文章

2023年金三银四必备软件测试常见面试题1500问!!!

十九、持续集成19.1 jenkins ant jmeter svn接口自动化测试?jenkins ant jmeter svn环境搭建原来这个环境是我这边搭建的&#xff0c;主要是几个步骤&#xff0c;第一Jenkins安装、第二&#xff0c;ant安装、第三&#xff0c;jmeter安装、第四&#xff0c;jmeter与ant连…

HTML基础(1)

HTML基础HTML基本介绍编辑工具HTML概述多如牛毛的标签头部标签&#xff1a;标题与段落标签&#xff1a;br换行符&#xff1a;a href超链接标签&#xff1a;< meta > 元素标签&#xff1a;主体标签HTML注释&#xff1a;水平线标签hr&#xff1a;段落标签p&#xff1a;文本…

[ 常用工具篇 ] 多媒体视频处理工具 ffmpeg 安装使用详解

&#x1f36c; 博主介绍 &#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 _PowerShell &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 &#x1f389;点赞➕评论➕收藏 养成习…

【python学习笔记】:字符串编码转换

在 Python 中&#xff0c;有 2 种常用的字符串类型&#xff0c;分别为 str 和 bytes 类型&#xff0c;其中 str 用来表示 Unicode 字符&#xff0c;bytes 用来表示二进制数据。str 类型和 bytes 类型之间就需要使用 encode() 和 decode() 方法进行转换。 Python encode()方法 …

软件工程(4)--螺旋模型

前言 这是基于我所学习的软件工程课程总结的第四篇文章。 在软件开发过程中必须及时识别和分析风险&#xff0c;并且采取适当措施以消除或减少风险的危害。构建原型是一种能使某些类型的风险降至最低的方法。为了降低交付给用户的产品不能满足用户需要的风险&#xff0c;一种行…

LeetCode 725. 分隔链表

LeetCode 725. 分隔链表 难度&#xff1a;middle\color{orange}{middle}middle 题目描述 给你一个头结点为 headheadhead 的单链表和一个整数 kkk &#xff0c;请你设计一个算法将链表分隔为 kkk 个连续的部分。 每部分的长度应该尽可能的相等&#xff1a;任意两部分的长度差…

〖产品思维训练白宝书 - 核心竞争力篇⑯〗- 产品经理核心竞争力解读之如何学习的又快又好并学以致用

大家好&#xff0c;我是 哈士奇 &#xff0c;一位工作了十年的"技术混子"&#xff0c; 致力于为开发者赋能的UP主, 目前正在运营着 TFS_CLUB社区。 &#x1f4ac; 人生格言&#xff1a;优于别人,并不高贵,真正的高贵应该是优于过去的自己。&#x1f4ac; &#x1f4e…

前端算法codewhy第一章: 邂逅数据结构与算法

第一章: 邂逅数据结构与算法 编程的真相 – 数据的处理 数据结构与算法的本质 学习数据结构与算法到底有什么实际应用&#xff1f; 源码中的数据结构 如何学习数据结构与算法&#xff1f; TypeScript常见数据结构与算法 到底什么是数据结构 什么是数据结构&#xff08;Data Str…

数据库系统之并发控制(重点标记)

1. 并发控制概述 事务是并发控制的基本单位&#xff0c;并发控制机制的任务是&#xff1a; 对并发操作进行正确调度。保证事务的隔离性。保证数据库的一致性。 数据不一致及其原因 并发操作带来的数据不一致性主要包括丢失修改&#xff0c;不重复读和读“脏”数据。产生三类数…

Appium自动化测试 Inspector定位Webview/H5页面元素

目录操作步骤Python操作该混合App代码Appium在操作混合App或Android App的H5页面时, 常常需要定位H5页面中的元素, 传统方式是 FQ 使用Chrome://inspect来定位元素, 环境准备相当繁琐, 不仅需要想办法FQ, 而且还需要Android设备安装Google框架以及手机版Chrome浏览器以及相应的…

图片分类 STL-10 数据集下载及使用指南

转载自安全验证 - 知乎 这次给大家介绍的 STL10数据集&#xff0c;是图片分类任务早期常用的基准数据集之一&#xff0c;虽然只有10种样本&#xff0c;图片尺寸也偏小&#xff0c;但是标注类型比较平衡&#xff0c;各种种类都有各500张&#xff08;train&#xff09;/800张&am…

深度解析linux的文件系统

背景&#xff1a;虚拟文件系统&#xff08;有时也称作虚拟文件交换&#xff0c;更常见的是简称VFS)作为内核子系统&#xff0c;为用户空间程序提供了文件和文件系统相关的接口。系统中所有文件系统不但依赖VFS共存&#xff0c;而且也依靠VFS系统协同工作。通过虚拟文件系统&…

动态规划(一):01背包问题和完全背包问题

动态规划 目录动态规划1.01背包问题1.1题目介绍1.2思路一介绍(二维数组)1.3思路二介绍(一维数组) 空间优化1.4思路三介绍(输入数据优化)2.完全背包问题2.1题目描述&#xff1a;2.2思路一(朴素算法)2.3思路二(将k优化处理掉)2.4思路三(优化j的初始条件)总结1.01背包问题 1.1题目…

求职-进度

2-23 投递 恒生校招 C https://campus.hundsun.com/personal/deliveryRecord 投递 合合信息 大数据开发工程师 https://intsig.zhiye.com/personal/deliveryRecord 投递 尚游网络 游戏服务器开发工程师 https://app.mokahr.com/campus_apply/shangyou/36582?recommendCodeDS…

项目管理中,哪些信息差是不应该存在的呢?

在项目管理中&#xff0c;如果存在信息差&#xff0c;那么就会存在了巨大的问题&#xff0c;从而导致项目的失败。 项目管理中哪些信息差是不应该存在的呢&#xff1f; 1、项目背景 项目经理接手项目&#xff0c;首先要了解清楚项目背景&#xff0c;避免在项目过程中对自己…

计算句子向量相似度:SentenceBert和SimCSE

SentenceBert Sentence-BERT: 如何通过对比学习得到更好的句子向量表示 - 哔哩哔哩 (bilibili.com) (229条消息) Sentence-BERT详解_数学家是我理想的博客-CSDN博客_sentence-bert 动机&#xff1a; 直接把2个句子串联起来输入Bert做分类&#xff08;即Cross-Encoder方式&…

Blazor入门100天 : 身份验证和授权 (6) - 使用 FreeSql orm 管理ids数据

目录 建立默认带身份验证 Blazor 程序角色/组件/特性/过程逻辑DB 改 Sqlite将自定义字段添加到用户表脚手架拉取IDS文件,本地化资源freesql 生成实体类,freesql 管理ids数据表初始化 Roles,freesql 外键 > 导航属性完善 freesql 和 bb 特性 本节源码 https://github.com/…

Maven基础-又简单又详细

如果文章对你有帮助欢迎【关注❤️❤️❤️点赞&#x1f44d;&#x1f44d;&#x1f44d;收藏⭐⭐⭐】一键三连&#xff01;一起努力&#xff01; 一、Maven简介 1、maven是什么 Maven的本质是一个项目管理工具&#xff0c;将项目开发和管理过程抽象成一个项目对象模型&#x…

JavaTCP通信程序

3 TCP通信程序 3.1 TCP通信原理 TCP通信协议是一种可靠的网络协议&#xff0c; 它在通信的两端名建立一个Socke对象&#xff0c; 从而在通信的两端形成网络虚拟链路一旦建立了 虚拟的网络链路&#xff0c;两端的程序就可以通过虚拟链路进行通信Java对基于TCP协议的的网络提供…

python3.11.2安装 + pycharm安装

下载 &#xff1a;https://www.python.org/ 2.双击下载的软件&#xff1a; 3.进入安装界面 下一步&#xff0c;点击 是 上一步点击后就看到如下&#xff1a; 安装成功了&#xff0c;接下来检测一下&#xff1a;cmd 安装pycharm PyCharm是一种Python IDE&#xff08;Integr…