2017-01-01 3 views
1

は、私は以下のように2次元配列を作成したい配列を作成するためのアルゴリズムまたはコード、ルールは指定されていますか?例については</p> <p>:

For level 3: 


     7   => Array[2] 

    3   6  => Array[1] 

1  2  4  5 => Array[0] 


i.e. Array = [[1,2,4,5], [3,6], [7]] 

を。

For level 4: 

        15       => Array[3] 

     7      14    => Array[2] 

    3   6   10   13  => Array[1] 

1  2  4  5 8  9  11  12 => Array[0] 


i.e. Array = [[1,2,4,5,8,9,11,12], [3,6,10,13], [7,14], [15]] 

私が必要とするのは、上記のようにArrayを返す引数としてレベル数をとる関数です。

すなわち:

def function(level): 
    ''' .......................... 


    ...........................''' 
    return Array 
+0

、私はあなたがこんにちは、私は申し訳ありませんバイナリツリー – Daniel

+0

に2D配列を関連付けることによって、意味を理解didntの。配列を塗りつぶすためのルールは完璧なバイナリツリーのようなものなので、わかりやすいと思います。 – codeezer

+1

本当に何かを試してみましょう。 – dmitryro

答えて

0

の最後の行は、あなたのデータ構造が再帰的ですので、それを生産するために再帰関数を使用するのが自然です。

深さがdepthのツリーのルートノードはn = 2 ** depth - 1です。ビットシフトを使って計算するほうが効率的です。左のサブツリーにはルートノードがn // 2、右のサブツリーにはn // 2がすべてのノードに追加されています。

ここには、希望するリストを生成する再帰的ジェネレータがあります。

def btree(depth): 
    if depth < 1: 
     return 

    n = (1 << depth) - 1 
    yield [n] 

    a = n // 2 
    for seq in btree(depth - 1): 
     yield seq + [u + a for u in seq] 

lst = list(btree(4))[::-1] 
print(lst) 

出力

[[1, 2, 4, 5, 8, 9, 11, 12], [3, 6, 10, 13], [7, 14], [15]] 

あなたは、トップダウンのために、木の行を印刷したい場合は、単にこれを行うことができます。

for row in btree(5): 
    print(row) 

出力を

[31] 
[15, 30] 
[7, 14, 22, 29] 
[3, 6, 10, 13, 18, 21, 25, 28] 
[1, 2, 4, 5, 8, 9, 11, 12, 16, 17, 19, 20, 23, 24, 26, 27] 
+0

ありがとうございました。それはまさに私が欲しいものです。 – codeezer

+0

ohh ...ええ、私はそれについて知らなかった。情報をもう一度ありがとうございます。 – codeezer

0

ヒント:ここでは数字

def last_row(level): 
    m = 2 ** (level - 1) 
    L = [0 for i in range(m)] 
    L[0] = 1 
    k = 1 
    while k < m: 
     incr = 2 * k - 1 
     for i in range(k): 
      L[k+i] = L[i] + incr 
     k = incr + 1 
    return L 
0

これは私が考えた別の再帰的な解決策です。左のサブツリーの値はfloor(現在の値)で、右のサブツリーの値は(現在の値-1)です。 私は2の必要な累乗をあらかじめ計算していますが、引き分けは追加の引数(リスト)を渡したものです:いずれにしても、ソリューションを構築するときには分かりやすくするために役立ちます。私は質問が少し不明瞭だと思う

def driver(level): 
    if level <= 0: 
     return None 
    # initialize the list to have (level) columns 
    lst = [[] for i in range(level)] 
    # pre-calculate the necessary powers of 2 
    powers = [1] 
    for i in range(1, level+1): 
     powers.append(powers[i-1] << 1) 

    # call the main calculation function 
    calc(level, powers[level]-1, lst, powers) 

    return lst 

def calc(level, val, lst, powers): 
    # add the value in pre-order 
    lst[level-1].append(val) 
    # base case, level is 1, 
    # do not make additional recursive calls here 
    if level > 1: 
     # calculate values in the left sub-tree 
     calc(level-1, val - powers[level-1], lst, powers) 
     # calculate values in the right sub-tree 
     calc(level-1, val-1, lst, powers) 

print(driver(4)) 
関連する問題

 関連する問題