1. 程式人生 > >python實現滿二叉樹遞歸循環

python實現滿二叉樹遞歸循環

location pre tar 頂點 遞歸循環 int tle 計算 個數

一、二叉樹介紹點這片文章

二叉樹及題目介紹

例題:
有一顆滿二叉樹,每個節點是一個開關,初始全是關閉的,小球從頂點落下,
小球每次經過開關就會把它的狀態置反,這個開關為關時,小球左跑,為開時右跑。現在問第k個球下落到d層時的開關編號。輸入深度d和小球個數k

思路分析:首先該題最先想到的是模擬,開一個數組表示開關,下標表示編號,根據k的子樹為2k和2k+1來改變數組,判斷進行。但是這樣太麻煩了。而且根據深度和小球個數,導致計算量太大。
尋找規律:

可以知道每一層,第奇數個落入該層的球都是往左,第偶數個落入該層的球都是往右。
小球按照編號依次下落的,對於左枝(也就是奇數球),每個I號小球落入該層都是第(k+1)/2個小球。而偶數是往右走的k/2個小球

所以采取每一次一個循環,來判斷k%2小球往哪兒走,循環d層,即可找出最後葉子!省去大數組和大時間

pytho實現
def bin_tree(x,floor):
    num = x
    location = 1  #設定初始位置第一層第一個
    for f in range(1, floor):
        if num%2: #只要是基數就往左邊走
            num = (num + 1)/2 #每個位置會經過的小球重新編號
            location = 2*location  #左邊的就是location的2倍
        else:
            num = num/2
            location = 2*location + 1  #右邊為location 2倍?1
        print(location)

bin_tree(5, 6)

#結果為

2
4
9
18
36

python實現滿二叉樹遞歸循環