python实现满二叉树递归循环

二叉树及题目介绍

例题:
有一颗满二叉树,每个节点是一个开关,初始全是关闭的,小球从顶点落下,
小球每次经过开关就会把它的状态置反,这个开关为关时,小球左跑,为开时右跑。现在问第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

posted @ 2018-08-18 00:08  G1733  阅读(541)  评论(0编辑  收藏  举报