Lowest Common Ancestor of Two Nodes in a Binary Tree

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          forint 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      }
相關文章
相關標籤/搜索