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

题目描述

给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。
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
}
···
posted @   含若飞  阅读(77)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示