二叉搜索树的最近公共祖先
题目描述
给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。
1.对于该题的最近的公共祖先定义:对于有根树T的两个节点p、q,最近公共祖先LCA(T,p,q)表示一个节点x,满足x是p和q的祖先且x的深度尽可能大。在这里,一个节点也可以是它自己的祖先.
2.二叉搜索树是若它的左子树不空,则左子树上所有节点的值均小于它的根节点的值; 若它的右子树不空,则右子树上所有节点的值均大于它的根节点的值
3.所有节点的值都是唯一的。
4.p、q 为不同节点且均存在于给定的二叉搜索树中
思路分析
给定两个值,判断它的最近公共祖先。因为是二叉搜索树,也就是说root.left的所有值都小于root,右侧的值都大于右侧。我们可以从他们的大小关系上入手,考虑使用递归
那么递归退出条件如何判定,也就是p和q分别处于当前节点的左侧和右侧,或者说其中有一个节点刚好等于当前的root就返回,那么就可以很快的得到答案
代码参考
const lowestCommonAncestor = function (root, p, q) {
if (root == null)
return null
// 如果两个值都小于根节点,说明祖先在左子树一侧
if (p < root.val && q < root.val)
return lowestCommonAncestor(root.left, p, q)
// 如果两个值都大于根节点,说明祖先在右子树一侧
else if (p > root.val && q > root.val)
return lowestCommonAncestor(root.right, p, q)
//否则,在两个值中间,或者等于其中一个值
else
return root.val
}
···
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理