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)是同一个概念的不同称呼,它们都是指一种特殊类型的二叉树。这种树具有以下特性:
若任意节点的左子树不空,则左子树上所有节点的值均小于它的根节点的值。
若任意节点的右子树不空,则右子树上所有节点的值均大于它的根节点的值。
任意节点的左、右子树也分别为二叉搜索树(或二叉查找树、二叉排序树)。
整体思路为:
对于给定的值p、q:
①如果节点的值大于p,q则公共祖先在左子树;
②如果节点的值小于p,q,则公共祖先在右子树;
③如果节点的值在p、q对应的区间内,则当前节点就是公共祖先。
采用递归的方式对查找公共祖先。递推公式如下:
有了递推公式,就可以很方便的写出对应方代码。
如果文字描述的不太清楚,你可以参考视频的详细讲解。
Python版本:哔哩哔哩_bilibili
https://www.bilibili.com/cheese/play/ep1372245
Golang版本:哔哩哔哩_bilibili
https://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编码:哔哩哔哩_bilibili
https://www.bilibili.com/cheese/play/ep1372245
Golang编码:哔哩哔哩_bilibili
https://www.bilibili.com/cheese/play/ep1364778
4.小结
依据二叉搜索树的性质来求解公共祖先,对于给定的值p、q:①如果节点的值大于p,q则公共祖先在左子树;②如果节点的值小于p,q,则公共祖先在右子树;③如果节点的值在p、q对应的区间内,则当前节点就是公共祖先。
《数据结构与算法》深度精讲课程正式上线啦!七大核心算法模块全解析:
✅ 链表
✅ 二叉树
✅ 二分查找、排序
✅ 堆、栈、队列
✅ 回溯算法
✅ 哈希算法
✅ 动态规划
无论你是备战笔试面试、提升代码效率,还是突破技术瓶颈,这套课程都将为你构建扎实的算法思维底座。🔥立即加入学习打卡,与千名开发者共同进阶!
Python编码实现:哔哩哔哩_bilibili
https://www.bilibili.com/cheese/play/ss897667807
Golang编码实现:哔哩哔哩_bilibili
https://www.bilibili.com/cheese/play/ss63997
对于二叉树的相关算法,我们总结了一套【可视化+图解】方法,依据此方法来解决相关问题,算法变得易于理解,写出来的代码可读性高也不容易出错。具体也可以参考视频详细讲解。
今日佳句:露从今夜白,月是故乡明。