📜  数据结构 |二叉搜索树 |问题 12(1)

📅  最后修改于: 2023-12-03 15:40:00.354000             🧑  作者: Mango

数据结构 | 二叉搜索树 | 问题 12

介绍

二叉搜索树(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 的基础知识以及常见的解决方法,对每一个程序员来说都是非常重要的。