1. 程式人生 > >尋找二叉樹中兩個節點的最近的公共祖先——迅雷筆試歸來

尋找二叉樹中兩個節點的最近的公共祖先——迅雷筆試歸來

      迅雷的筆試可真讓人煎熬啊,題量很大,而且考試時間是三個小時。不過迅雷的題目質量很高,既考查了基礎知識又不乏高難的資料結構和演算法題目。下面和大家分享兩道演算法程式設計題,程式碼沒有在編譯器上除錯,可能會出現一點小bug,感興趣的朋友可以編譯除錯一下。

題目1:將一個單鏈表逆轉——原來的頭指標變為尾指標,原來的尾指標變為頭指標。

演算法思想:從連結串列的頭結點開始依次逆轉,最終將整個連結串列逆轉。

程式程式碼:

題目2:要求尋找二叉樹中兩個節點的最近的公共祖先,並將其返回。

演算法思想:這道題的關鍵在於每個節點中包含指向父節點的指標,這使得程式可以用一個簡單的演算法實現。首先給出p的父節點p->parent,然後將q的所有父節點依次和p->parent作比較,如果發現兩個節點相等,則該節點就是最近公共祖先,直接將其返回。如果沒找到相等節點,則將q的所有父節點依次和p->parent->parent作比較......直到p->parent==root。

程式程式碼:

知識拓展:對於第二個二叉樹的問題,如果節點中不包含指向父節點的指標應該怎麼計算?

演算法思想:如果一個節點的左子樹包含p,q中的一個節點,右子樹包含另一個,則這個節點就是p,q的最近公共祖先。

程式程式碼: