1. 程式人生 > >九章演算法面試題56 最近公共祖先

九章演算法面試題56 最近公共祖先

九章演算法官網-原文網址


題目

給出一棵二叉樹和兩個二叉樹上的節點,求出這兩個點的最近公共祖先(Lowest Common Ancestor, LCA)。

如下面這棵二叉樹:

          1

        /    \

       2     3

            /    \

          4       5

4和5的最近公共祖先是3,2和4的最近公共祖先是1,1和3的最近公共祖先是1(假設自己是自己的祖先)

Follow Up Question 1: 如果樹中的每個節點儲存了自己的parent節點,演算法應該是什麼樣的?

Follow Up Question 2: 如果樹中的每個節點沒有儲存自己的parent節點,但給你這棵二叉樹的根節點,演算法應該是什麼樣的?


解答


對於有parent節點的二叉樹,方法很簡單,就是分別從兩個節點網上列出到根的所有點,再反向查詢第一個分叉的位置。

對於沒有parent節點的二叉樹,必須給出root。然後從root開始用分治演算法往兩邊查詢兩個節點。如果有LCA就返回LCA,如果碰到其中一個點就返回其中一個點。

參考程式