-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathLowestCommonAncestorOfABinarySearchTree.java
More file actions
68 lines (47 loc) · 1.91 KB
/
LowestCommonAncestorOfABinarySearchTree.java
File metadata and controls
68 lines (47 loc) · 1.91 KB
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
package binary_tree;
/**
* @Author: Wenhang Chen
* @Description:给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。
* <p>
* 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”
* <p>
* 例如,给定如下二叉搜索树: root = [6,2,8,0,4,7,9,null,null,3,5]
* 示例 1:
* <p>
* 输入: root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q = 8
* 输出: 6
* 解释: 节点 2 和节点 8 的最近公共祖先是 6。
* 示例 2:
* <p>
* 输入: root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q = 4
* 输出: 2
* 解释: 节点 2 和节点 4 的最近公共祖先是 2, 因为根据定义最近公共祖先节点可以为节点本身。
* @Date: Created in 10:16 11/28/2019
* @Modified by:
*/
public class LowestCommonAncestorOfABinarySearchTree {
public class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) {
val = x;
}
}
/**
* 1. 从根节点开始遍历树
* 2. 如果节点 p和节点 q都在右子树上,那么以右孩子为根节点继续 1 的操作
* 3. 如果节点 p和节点 q都在左子树上,那么以左孩子为根节点继续 1 的操作
* 4. 如果条件 2 和条件 3 都不成立,这就意味着我们已经找到节 p和节点 q的 LCA 了
*/
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
if (root == null) return null;
if (root.val < p.val && root.val < q.val) {
return lowestCommonAncestor(root.right, p, q);
} else if (root.val > p.val && root.val > q.val) {
return lowestCommonAncestor(root.left, p, q);
} else {
return root;
}
}
}