当前位置: 首页 > news >正文

可视化图解算法34:二叉搜索树的最近公共祖先

1. 题目

描述

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

1.对于该题的最近的公共祖先定义:对于有根树T的两个节点p、q,最近公共祖先LCA(T,p,q)表示一个节点x,满足x是p和q的祖先且x的深度尽可能大。在这里,一个节点也可以是它自己的祖先.

2.二叉搜索树是若它的左子树不空,则左子树上所有节点的值均小于它的根节点的值; 若它的右子树不空,则右子树上所有节点的值均大于它的根节点的值

3.所有节点的值都是唯一的。

4.p、q 为不同节点且均存在于给定的二叉搜索树中。

数据范围:

3<=节点总数<=10000

0<=节点值<=10000

如果给定以下搜索二叉树: {7,1,12,0,4,11,14,#,#,3,5},如下图:

示例1

输入:

{7,1,12,0,4,11,14,#,#,3,5},1,12

返回值:

7

说明:

节点1 和 节点12的最近公共祖先是7  

示例2

输入:

{7,1,12,0,4,11,14,#,#,3,5},12,11

返回值:

12

说明:

因为一个节点也可以是它自己的祖先.所以输出12  

2. 解题思路

先来看一下二叉搜索树的性质:

二叉搜索树(Binary Search Tree)、二叉查找树(Binary Search Tree)和二叉排序树(Binary Sort Tree)是同一个概念的不同称呼,它们都是指一种特殊类型的二叉树。这种树具有以下特性:

  1. 若任意节点的左子树不空,则左子树上所有节点的值均小于它的根节点的值。

  2. 若任意节点的右子树不空,则右子树上所有节点的值均大于它的根节点的值。

  3. 任意节点的左、右子树也分别为二叉搜索树(或二叉查找树、二叉排序树)。

整体思路为:

对于给定的值p、q:

①如果节点的值大于p,q则公共祖先在左子树;

②如果节点的值小于p,q,则公共祖先在右子树;

③如果节点的值在p、q对应的区间内,则当前节点就是公共祖先。

采用递归的方式对查找公共祖先。递推公式如下:

有了递推公式,就可以很方便的写出对应方代码。

如果文字描述的不太清楚,你可以参考视频的详细讲解。

  • Python版本:哔哩哔哩_bilibilihttps://www.bilibili.com/cheese/play/ep1372245

  • Java版本:数据结构笔试面试算法-Java语言版_哔哩哔哩_bilibili数据结构笔试面试算法-Java语言版,bilibili课堂,哔哩哔哩课堂,哔哩哔哩,Bilibili,B站,弹幕https://www.bilibili.com/cheese/play/ep1367353

  • Golang版本:哔哩哔哩_bilibilihttps://www.bilibili.com/cheese/play/ep1364778

3. 编码实现

核心代码如下:

/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可*** @param root TreeNode类* @param p int整型* @param q int整型* @return int整型*/
func lowestCommonAncestor(root *TreeNode, p int, q int) int {// write code here// 2. 递归终止条件:空树找不到公共祖先if root == nil {return -1}// 1. 问题分解(递推公式)if root.Val > q && root.Val > p {// 1.1  pq都在节点的左边,则:公共祖先在左子树中return lowestCommonAncestor(root.Left, p, q)} else if root.Val < q && root.Val < p {// 1.2  pq都在节点的右边,则:公共祖先在右子树中return lowestCommonAncestor(root.Right, p, q)} else {// 1.3 节点的值在给定的区间,则:找到了公共祖先return root.Val}
}

具体完整代码你可以参考下面视频的详细讲解。

  • Python编码:哔哩哔哩_bilibilihttps://www.bilibili.com/cheese/play/ep1372245

  • Java编码:数据结构笔试面试算法-Java语言版_哔哩哔哩_bilibili数据结构笔试面试算法-Java语言版,bilibili课堂,哔哩哔哩课堂,哔哩哔哩,Bilibili,B站,弹幕https://www.bilibili.com/cheese/play/ep1367353

  • Golang编码:哔哩哔哩_bilibilihttps://www.bilibili.com/cheese/play/ep1364778

4.小结

依据二叉搜索树的性质来求解公共祖先,对于给定的值p、q:①如果节点的值大于p,q则公共祖先在左子树;②如果节点的值小于p,q,则公共祖先在右子树;③如果节点的值在p、q对应的区间内,则当前节点就是公共祖先。

《数据结构与算法》深度精讲课程正式上线啦!七大核心算法模块全解析:

  ✅   链表

  ✅   二叉树

  ✅   二分查找、排序

  ✅   堆、栈、队列

  ✅   回溯算法

  ✅   哈希算法

  ✅   动态规划

无论你是备战笔试面试、提升代码效率,还是突破技术瓶颈,这套课程都将为你构建扎实的算法思维底座。🔥立即加入学习打卡,与千名开发者共同进阶!

  • Python编码实现:哔哩哔哩_bilibilihttps://www.bilibili.com/cheese/play/ss897667807

  • Java编码实现:数据结构笔试面试算法-Java语言版_哔哩哔哩_bilibili数据结构笔试面试算法-Java语言版,bilibili课堂,哔哩哔哩课堂,哔哩哔哩,Bilibili,B站,弹幕https://www.bilibili.com/cheese/play/ss161443488

  • Golang编码实现:哔哩哔哩_bilibilihttps://www.bilibili.com/cheese/play/ss63997

对于二叉树的相关算法,我们总结了一套【可视化+图解】方法,依据此方法来解决相关问题,算法变得易于理解,写出来的代码可读性高也不容易出错。具体也可以参考视频详细讲解。

今日佳句:露从今夜白,月是故乡明。

相关文章:

  • Docker 容器化部署深度研究与发展趋势
  • mysql中执行select命令的顺序
  • upload-labs靶场通关详解:第一关
  • 基于OpenTelemetry的分布式链路追踪Trace‌实现(PHP篇)
  • FlyEnv:优雅直观的跨平台开发环境管理工具
  • vue3+vite项目引入tailwindcss
  • Spark处理过程-转换算子和行动算子
  • 通过vllm部署qwen3大模型以及基于 vLLM 的 OpenAI 兼容 API 接口调用方法总结
  • 详细剖析传输层协议(TCP和UDP)
  • 数据库即服务(DBaaS)领域的最新创新
  • 仿真系统-学生选课管理
  • DBa作业
  • 2021年CVPR文章【Polygonal Building Segmentation by Frame Field Learning】环境搭建
  • 微粉助手 1.1.0 | 专为社交电商用户设计的一站式营销工具,集成了群发消息、智能加好友、清理僵尸粉等功能
  • TextIn ParseX重磅功能更新:支持切换公式输出形式、表格解析优化、新增电子档PDF去印章
  • 【day04】Fibonacci数列 | 单词搜索 | 杨辉三角
  • vue项目部署后部分子页面刷新后403
  • tmpfs和普通文件系统相比有哪些优缺点
  • overflow使用
  • Whistle无权限访问本地文件
  • 重庆一高校75万采购市价299元产品?工作人员:正在处理
  • 印巴战火LIVE丨“快速接近战争状态”:印度袭击巴军事基地,巴启动反制军事行动
  • 招商蛇口:今年前4个月销售额约498.34亿元
  • 视频丨雄姿英发!中国仪仗队步入莫斯科红场
  • 七大交响乐团“神仙斗法”,时代交响在上海奏出时代新声
  • 招行:拟出资150亿元全资发起设立金融资产投资公司