python實現-滿二叉排序樹中尋找三個節點的最小子樹的根節點__python

來源:互聯網
上載者:User

題目描述:

於一棵滿二叉排序樹深度為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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.