Reference:html
http://blog.csdn.net/v_july_v/article/details/18312089
node
http://leetcode.com/2011/07/lowest-common-ancestor-of-a-binary-tree-part-ii.htmlspa
(1) Is the tree a BST or not?.net
BST的话,咱们就能按照BST的定义思考了。当前遍历的node若是比咱们要找的两个点都大,说明那两个点都在当前node的左边,因此这两个node的祖先确定在当前node的左边,因此往左边找。反之,往右边找。若是这两个点一个大于当前node一个小于当前node,说明当前node就是LCA。 若是这两个点一个是另外一个的祖先,那么这个点就是LCA。
code
代码以下:htm
1
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
2
if(p.val < root.val && q.val < root.val)
3
return lowestCommonAncestor(root.left, p, q);
4
else
if(p.val > root.val && q.val > root.val)
5
return lowestCommonAncestor(root.right, p, q);
6
else
7
return root;
8 } blog
(2)那若是不是BST呢?通常Binary Tree.递归
a. Tree结构中没有parent域。leetcode
递归找。get
代码以下:
1
//
Worst case O(n)
2
Node getLCA(Node root, Node node1, Node node2){
3
if(root ==
null)
4
return
null
5
if(root == node1 || root == node2)
6
return root;
7
8 Node left = getLCA(root.left, node1, node2);
9 Node right = getLCA(root.right, node1, node2);
10
11
if(left !=
null && right !=
null)
12
return root;
13
else
if(left !=
null)
14
return left;
15
else
if(right !=
null)
16
return right;
17
else
18
return
null;
19 }
b. 若是有parent域。
转化为两个linkedlist的交点问题。
代码以下:
1
int getHeight(Node p){
2
int height = 0;
3
while(p!=
null){
4 height++;
5 p = p.parent;
6 }
7
return height;
8 }
9
10
void swap(
int a,
int b){
11 a = a + b;
12 b = a - b;
13 a = a - b;
14 }
15
16 Node getLCA(Node p, Node q){
17
int h1 = getHeight(p);
18
int h2 = getHeight(q);
19
20
//
q is always deeper than p
21
if(h1 > h2){
22 swap(h1, h2);
23 swap(p, q);
24 }
25
26
int diff = h2 - h1;
27
28
for(
int i = 0; i < diff; i++)
29 q = q.parent;
30
31
while(p!=
null && q!=
null){
32
//
common node
33
if(p == q)
34
return p;
35 p = p.parent;
36 q = q.parent;
37 }
38
39
return NULL;
//
p and q are not in the same tree
40 }