1. 程式人生 > >阿里一道面試題——完全二叉樹的最後一顆節點

阿里一道面試題——完全二叉樹的最後一顆節點

今天和朋友聊天,說是阿里有道面試題。
已知一顆完全二叉樹,有N個節點 求最後一個節點,亦即最後一排最右邊的那個節點。
一顆15個節點的二叉樹
節點數目2^0+……2^(k-1)>=N >= 2^0+2^1+2^2+2^3……2^k
那麼樹深為k+1,最後個節點在最後層為第(N-2^0+……2^(k-1))個
如果(N-2^0+……2^k-1)>2^k/2,那麼在右子樹,右子樹有N-2^(k-1)個節點,;
如果(N-2^0+……2^k-1)<=2^k/2,那麼在左子樹

從根節點出發,首先要判斷是在右子樹裡還是在左子樹裡。要明確一點已知節點數目N,那麼我們是可以判斷最後一個節點是在第幾排,第幾個。如上N=15,那麼是在第4排的第8個節點。而8 > 4(這裡判斷是在右子樹還是左子樹)。
現在我們從節點C作為根節點的子樹,按照上面的方法,最後找到該節點。

逆向思維:
我們將所有節點標號,從1~N,那麼N節點就是我們要求的節點。那麼N節點的父節點為N/2,其為(N%2==1)?右節點:左節點。
以上圖舉例:

15 % 2 = 1 ——————所以走右邊
15/2 = 7
7 % 2 = 1——————所以走右邊
7/2 = 3
3 % 2 = 1——————所以走右邊
1 / 2 = 0——————結束

上述15為節點數,大家可以試試看,是否正確。其實這個方法也是可以從上面那種方法歸納出來。