📅  最后修改于: 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;
};