2013-11-23 56 views
2

我必須製作一個程序來解析使用集合括號和數字表示的樹。因此,每個括號代表樹中的節點,程序應該打印出每個父節點的所有子節點。 python代碼如下:使用python解析樹

class context(object): 
    def __init__(self, label=None, parent=None, children=[]): 
     self.label = label 
     self.parent = parent 
     self.children = [] 
     self.list = [] 

    def make_tree(self, tree): 
     stack = [] 
     index = 0 
     while index < len(tree): 
      if tree[index] is '(': 
       if self.label is None: 
        self.label = tree[index+1] 
        index = index+1 
       else: 
        if len(stack) == 0: 
         stack.append(context(tree[index+1], self.label)) 
         index = index+1 
        else: 
         stack.append(context(tree[index+1], stack[len(stack)-1].label)) 
         index = index+1 

      elif tree[index] is ')': 
       if len(stack) == 1: 
        self.children.append(stack.pop()) 
        return 
       else: 
        stack[len(stack)-2].children.append(stack.pop()) 
      index = index+1 

    def traverse(self, size, obj): 
     if self.label is None or size == 0: 
      return [] 
     temp_list = [] 
     temp = [] 
     dic = {} 
     tt = [children.label for children in obj.children] 
     dic[obj.label] = tt 
     temp.append(dic) 
     for child in obj.children: 
      temp_list = child.traverse(len(child.children), child) 
     print temp 
     return temp + temp_list 


line = '(Root (1 (2) (3 (4) (5) ) (6 (7) (8 (9) ) ) ) ) '.split() 
test = context() 
test.make_tree(line) 
final = test.traverse(len(test.children), test) 

結果必須是這樣的。 Result

如果我打印出make_tree函數中的列表,我會得到正確的結果......但最終結果是不正確的。在這種情況下,我失蹤{'3':['4','5']} final result

有什麼評論?

+0

你如何打印出最後:

def traverse(self, size, obj, tmpList): if self.label is None or size == 0: return [] dic = {} tt = [children.label for children in obj.children] dic[obj.label] = tt tmpList.append(dic) for child in obj.children: child.traverse(len(child.children), child, tmpList) return tmpList 

您可以通過撥打這個?因爲我只看到 - '[{'Root':['1']}]'。 – p0lAris

+0

@ flippex17只需在運行此代碼後鍵入final即可。 – eChung00

+0

哦,我很抱歉,我沒有太在意。我會研究它。 – p0lAris

回答

1

我只是看着你的一些代碼。它沒有太多的時間,所以我不能真正調試它的方式更多,但你也可以通過讓tmpList以所屬方式實現,並基本上保持每一點更新。 Alko的解決方案也適用,但這可能會更清楚一些。

​​
+0

非常感謝 – eChung00

1

您覆蓋孩子的結果與分配給temp_list,你可能就要做到:

for child in obj.children: 
    temp_list += child.traverse(len(child.children), child) 
+0

非常感謝你! – eChung00