1. 程式人生 > >Lowest Common Ancestor of Two Nodes in a Binary Tree

Lowest Common Ancestor of Two Nodes in a Binary Tree

Reference:

http://blog.csdn.net/v_july_v/article/details/18312089 

http://leetcode.com/2011/07/lowest-common-ancestor-of-a-binary-tree-part-ii.html

(1) Is the tree a BST or not?

     BST的話,我們就能按照BST的定義思考了。當前遍歷的node如果比我們要找的兩個點都大,說明那兩個點都在當前node的左邊,所以這兩個node的祖先肯定在當前node的左邊,所以往左邊找。反之,往右邊找。如果這兩個點一個大於當前node一個小於當前node,說明當前node就是LCA。 如果這兩個點一個是另一個的祖先,那麼這個點就是LCA。

程式碼如下:

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     } 

(2)那如果不是BST呢?一般Binary Tree.

   a. Tree結構中沒有parent域。

       遞迴找。

       程式碼如下:

 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 p21         if(h1 > h2){
22             swap(h1, h2);
23             swap(p, q);
24         }
25         
26         int diff = h2 - h1;
27         
28         forint i = 0; i < diff; i++)
29             q = q.parent;
30         
31         while(p!=null && q!=null){
32             //common node33             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 tree40     }