思路(一次遍历法)
思路来自:二叉搜索树的最近公共祖先
注意到题目中给出的是一棵「二叉搜索树」,因此我们可以快速地找出树中的某个节点以及从根节点到该节点的路径,例如我们需要找到节点 p:
- 我们从根节点开始遍历;
- 如果当前节点就是 p,那么成功地找到了节点;
- 如果当前节点的值大于 p的值,说明 p 应该在当前节点的左子树,因此将当前节点移动到它的左子节点;
- 如果当前节点的值小于 p的值,说明 p应该在当前节点的右子树,因此将当前节点移动到它的右子节点。
具体寻找最近公共组先思路
我们从根节点开始遍历;
-
如果当前节点的值大于 p 和 q的值,说明 p 和 q 应该在当前节点的左子树,因此将当前节点移动到它的左子节点;
-
如果当前节点的值小于 p 和 q 的值,说明 p 和 q 应该在当前节点的右子树,因此将当前节点移动到它的右子节点;
-
如果当前节点的值不满足上述两条要求,那么说明当前节点就是「分岔点」。此时,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) {
var res = root;
while(true) {
if(res.val > p.val && res.val > q.val) res = res.left;
else if(res.val < p.val && res.val < q.val) res = res.right;
else return res;
}
};