題目描述:
於一棵滿二叉排序樹深度為k,節點數為2^k-1;節點值為1至(2^k - 1),給出k和任意三個節點的值,輸出包含該三個節點的最小子樹的根節點。
範例輸入:4 10 15 13
範例輸出:12
首先,我們來理解一下滿二叉排序樹,如下就是一個4層的滿二叉排序樹:
根據上圖可以看出,滿二叉排序樹的中序遍曆是從1到2^k - 1的遞增序列(k為層數)。所以,只要給出層數我們就能夠確定這個二叉排序樹。同時,觀察可知,二叉排序樹從上到下的根節點剛好是所有元素進行二分尋找的中間節點。
根據上面的規律要解決三個節點的最小子樹的根節點這個問題可以得到如下幾點:
無須建立二叉樹,從1-2^k - 1的遞增數組即就是一個滿二叉排序樹
當輸入的三個元素在二分節點兩側時,當前的二分節點就是要尋找的最小子樹的根節點(根據這個規則,我們也無需判斷三個元素,只需判斷最大元素和最小元素的位置即可)
當最小節點的值大於二分節點的值,則繼續在二分的右半部分進行尋找
當最大節點的值小於二分節點的值,則繼續在二分的左半部分進行尋找
根據如上幾點,編寫 python 代碼如下:
K, a, b ,c = map(int, raw_input().split())print K,a,b,cmaxvalue = max(a,b,c)minvalue = min(a,b,c)left = 1right = pow(2, K)-1middle = (left + right)/2while True: if minvalue < middle and middle < maxvalue: break if middle < minvalue: left = middle + 1 middle = (left + right) / 2 elif middle > maxvalue: right = middle - 1 middle = (left + right) / 2print middle