2017-12-19 14 views
0

各ノードが子ノードに接続されている非バイナリツリーを設定するプログラムを作成しようとしています。このテストの例では、わかりやすくするためにバイナリツリーを使用しました。入力は次のとおりです。非バイナリツリー再帰

1 
3 5 
4 6 

(タブ文字は数字の間に使用されます)。

4 
/
    3 
/\ 
1 6 
\/
    5 
    \ 
    4 
:ツリー図はこのようになります は、私はその子が3と5であることと、ルート(1)から始まるツリーを生成しようとしていて、それらのノードのそれぞれは、子供4と6 を持っています

ツリーに子を追加しようとすると、再帰関数を呼び出す無限ループが作成されます。私は、ループ上の1である枝を持つ関数を呼び出すことに問題を絞り込んだが、ここではコードでてきました:

# input is a list of branch values 
file = open("treehash.txt","r") 
input = file.readlines() 
for line in range(len(input)): 
input[line] = input[line].rstrip().split('\t') 
file.close() 

# create the tree node 
class Tree(object): 
    value = None 
    children = [] 
    def __init__(self, value): 
     self.value = value 

# adds all children to a given parent 
def set_children(parent, branch): 
    if branch < len(input) - 1: 
     for num in input[branch + 1]: 
      parent.children.append(Tree(int(num))) 
     for child in parent.children: 
      set_children(child, branch + 1) 

# store all roots in array 
roots = [] 
for root in range(len(input[0])): 
    roots.append(Tree(int(input[0][root]))) 
    set_children(roots[root], 0) 
+0

を4と6は、複数の親を持っている場合は、グラフではなく、木を持っています。 – Blckknght

+0

4と6は3と5に固有のものです。この例ではそれぞれ2つの出現があります。しかし、私は複数のルーツから始めるとグラフがあると思います。 – adapap

答えて

1

あなたは

class Tree(object): 
    value = None 
    children = [] 

で行ったように、あなたは、クラス内の変数を記述する場合インスタンスにではなくクラスにバインドされています。 valueの場合、__init__コンストラクタのインスタンスバインドされた変数で上書きしますが、childrenが参照するリストはすべてTreeインスタンスによって共有されます。

は、変数の設定の上に削除し、代わりに使用します。

class Tree(object): 
    def __init__(self, value): 
     self.value = value 
     self.children = [] 
関連する問題