235. Lowest Common Ancestor of a Binary Search Tree
题干简述:
给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。
Wiki 中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”。
解题思路
二叉检索树的特殊性质本次就不再阐述了,不了解的同学可以参考我之前的题解,搭配 google 食用。题干中给出的最近公共祖先(LCA)wiki 定义讲的也很清楚,需要注意的是,“ x 的深度尽可能大”翻译过来也就是离 p, q 尽可能的近。如果不考虑 BST 的特殊性质,此题通过递归,也是一样可以求解。每次递归时,判断当前节点的值,是否在 [p, q] 内;若是,直接返回;若否,继续对其左右子节点进行递归。但是,由于 BST 其左(右)子树的值必然小于(大于)其自身。因此,我们在判断当前节点是在 [p, q] 区间的左侧还是右侧后,可以只对其左(右)节点进行遍历。
题解
/**
* 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.val > p.val && root.val > q.val) return lowestCommonAncestor(root.left, p, q);
if (root.val < p.val && root.val < q.val) return lowestCommonAncestor(root.right, p, q);
return root;
};
Q.E.D.