📅  最后修改于: 2023-12-03 15:40:00.354000             🧑  作者: Mango
二叉搜索树(Binary Search Tree,简称 BST)是一种特殊的二叉树,它的左子树中的所有节点的值都小于该节点的值,右子树中的所有节点的值都大于该节点的值。因此,BST 中的每个节点都具有一个唯一的值。
在实际应用中,BST 可以被用来实现一些高效的查找、插入、删除操作。例如,通过 BST 可以快速地查找一个元素是否存在,也可以在 O(log n) 的时间复杂度内完成插入和删除操作。因此,掌握 BST 的基础知识对每一个程序员来说都是非常重要的。
在解决 BST 问题时,有许多经典的问题,其中问题 12 是比较典型的一道题目。
给定一个二叉搜索树以及其中的两个节点 p 和 q,请找出 p 和 q 的最近公共祖先(Lowest Common Ancestor,简称 LCA)。
在二叉搜索树中,最近公共祖先的定义为:对于一个节点 x,如果节点 p 和节点 q 分别在 x 的左子树和右子树中,则 x 就是 p 和 q 的最近公共祖先。
解决问题 12 的一个简单而直接的方法是借用二叉搜索树的性质,从根节点开始一遍遍历,在第一个出现 p 和 q 其中一个是左子树中,另一个是右子树中的节点是 LCA。因为树的遍历算法时间复杂度都是 O(n),所以该方法的时间复杂度是 O(n)。
然而,如果我们能够利用 BST 的性质,我们可以在 O(log n) 的时间复杂度内求解问题 12。
具体来讲,我们可以考虑从根节点开始遍历 BST,如果当前节点的值大于 p 和 q 的值,那么说明 p 和 q 都在当前节点的左子树中,那么我们就将当前节点移动到左子树中继续查找。如果当前节点的值小于 p 和 q 的值,那么说明 p 和 q 都在当前节点的右子树中,我们就将当前节点移动到右子树中继续查找。如果当前节点的值既不大于 p 和 q 的值,也不小于 p 和 q 的值,那么当前节点就是 p 和 q 的最近公共祖先。
具体实现的代码片段如下所示:
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
TreeNode node = root;
while (node != null) {
if (p.val < node.val && q.val < node.val) {
node = node.left;
} else if (p.val > node.val && q.val > node.val) {
node = node.right;
} else {
return node;
}
}
return null;
}
在以上代码中,我们使用一个 while 循环来遍历 BST。如果 p 和 q 都小于当前节点的值,我们就将当前节点移动到左子树,否则如果 p 和 q 都大于当前节点的值,我们就将当前节点移动到右子树。否则,当前节点就是 p 和 q 的最近公共祖先。
在本文中,我们介绍了二叉搜索树(BST)这一特殊的二叉树,以及在 BST 中解决问题 12 的方法。在 BST 中,问题 12 的解决方案可以利用 BST 的性质,通过遍历找到 p 和 q 的最近公共祖先。在实际应用中,掌握 BST 的基础知识以及常见的解决方法,对每一个程序员来说都是非常重要的。