-
Notifications
You must be signed in to change notification settings - Fork 0
/
lowest-common-ancestor-of-a-binary-search-tree.js
66 lines (62 loc) · 1.51 KB
/
lowest-common-ancestor-of-a-binary-search-tree.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
/**
* 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) {
let low = p.val;
let high = q.val;
if (low > high) {
const temp = low;
low = high;
high = temp;
}
// 利用二叉搜索树的特性
// 只需要 root.val 在 [low, high] 区间 就说明 当前节点就是要找的 最近公共最近祖先
const dfs = (root) => {
if (!root) return null;
if (root.val > high) {
// 大于区间的最大值
return dfs(root.left);
} else if (root.val < low) {
// 小于区间的最小值
return dfs(root.right);
} else {
// 在 [low, high] 之中
return root;
}
};
return dfs(root);
};
// 迭代
function helper(root, p, q) {
// 如果当前结点的值 val 在 [low, high] 之间, 即 val >= low && val <= high
// 则当前节点就是指定的 `最近公共祖先`
// 利用二叉搜索树的特性: 根节点大于左子树, 小于右子树
let low = p.val;
let high = q.val;
if (low > high) {
[low, high] = [high, low];
}
while (root) {
if (root.val > high) {
// 大于区间的最大值
root = root.left;
} else if (root.val < low) {
// 小于区间的最小值
root = root.right;
} else {
// 在 [low, high] 只见
return root;
}
}
return null;
}