📜  二进制搜索树中的最低共同祖先。(1)

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

二进制搜索树中的最低共同祖先

二进制搜索树(Binary Search Tree,简称BST)是一种树形数据结构,其中每个节点都具有一个键值,并且每个节点的左子树中的键值小于该节点的键值,右子树中的键值大于该节点的键值。在BST中,每一个元素都有唯一的位置,这使得查找和插入的效率较高。在BST中查找任何元素的时间是$O(h)$,其中$h$是树的高度。

最低共同祖先(Lowest Common Ancestor,简称LCA)指的是在二叉树中,找到两个节点的最近公共祖先结点。在BST中,LCA的查找可以很快地完成,可以使用递归和迭代两种方式实现。

递归实现

递归实现很容易理解,递归函数的输入是两个节点和当前的根节点。若根节点为空,则返回空;若两个节点中有一个为根节点,则返回根节点;否则,根据BST的性质在左子树或右子树中继续寻找LCA。

/**
 * Definition for a binary tree node.
 * function TreeNode(val) {
 *     this.val = val;
 *     this.left = this.right = null;
 * }
 */
/**
 * @param {TreeNode} root
 * @param {TreeNode} p
 * @param {TreeNode} q
 * @return {TreeNode}
 */
var lowestCommonAncestor = function(root, p, q) {
    if (!root || !p || !q) return null;
    if (p === root || q === root) return root;
    if ((p.val < root.val && q.val > root.val) || (p.val > root.val && q.val < root.val)) return root;
    else if (p.val < root.val && q.val < root.val) return lowestCommonAncestor(root.left, p, q);
    else return lowestCommonAncestor(root.right, p, q);
};
迭代实现

迭代实现可以用一个循环替代递归。对于BST的每个节点,要么是p和q的祖先,要么是p和q的后代,如果它既不是p和q的祖先也不是p和q的后代,则说明当前节点是LCA。

/**
 * Definition for a binary tree node.
 * function TreeNode(val) {
 *     this.val = val;
 *     this.left = this.right = null;
 * }
 */
/**
 * @param {TreeNode} root
 * @param {TreeNode} p
 * @param {TreeNode} q
 * @return {TreeNode}
 */
var lowestCommonAncestor = function(root, p, q) {
    if (!root || !p || !q) return null;
    while (root) {
        if (p === root || q === root) return root;
        if ((p.val < root.val && q.val > root.val) || (p.val > root.val && q.val < root.val)) return root;
        else if (p.val < root.val && q.val < root.val) root = root.left;
        else root = root.right;
    }
    return null;
};