2017-01-10 92 views
1

在Python中,我有一個代表二叉樹的嵌套列表的列表:轉換二叉樹的嵌套列表的列表

L = [0, [[1, [2, 3]], [4, [5, 6]]]] 

所以樹可以看出如下:

 0 
    /\ 
     1 4 
    /\ /\ 
    2 3 5 6 

我現在要實現的功能是作爲輸入樹的級別,並返回該級別的所有節點:

GetNodes(0) = 0 
GetNodes(1) = [1,4] 
GetNodes(2) = [2,3,5,6] 

有沒有簡單的方法來做到這一點,避免在L的所有嵌套列表上進行殘酷搜索? 是否有可能在python中進行更爲標準的二叉樹管理,也許可以將我的列表清單轉換成別的東西?

+1

看看這可以幫助:https://github.com/joowani/binarytree – scriptboy

+0

注意,你可以通過使用'collections.defaultdict'構建一棵樹:'def tree():return defaultdict(tree)'。訪問元素通過'[some_element]'完成。因爲你想要一個特定級別的所有元素,我認爲沒有別的辦法,只能從最頂層開始遍歷樹,直到指定的級別(這就是你所說的「暴力」)。 –

+0

它被稱爲級別遍歷。谷歌它,你會發現很多答案 –

回答

1

我會去BFS。會後儘快代碼:)

編輯:在這裏,你去

L = [0, [[1, [2, 3]], [4, [5, 6]]]] 


def getLevel(k, tree): 
    currentLevel = [tree[0]] 
    nextLevel = tree[1] 
    level = 1 
    while level <= k: 
     _currentLevel = [] 
     _nextLevel = [] 
     for subtree in nextLevel: 
      if isinstance(subtree, list): 
       _currentLevel.append(subtree[0]) 
       if isinstance(subtree[1], list): 
        _nextLevel.append(subtree[1]) 
       else: 
        _currentLevel.append(subtree[1]) 
      else: 
       _currentLevel.append(subtree) 
     currentLevel= _currentLevel 
     nextLevel = _nextLevel 
     level+=1 
    return currentLevel 



print getLevel(0, L) 
print getLevel(1, L) 
print getLevel(2, L) 
1

我的解決辦法解析成字典

l = [0, [[1, [2, 3, [[7,8], [10,11]]]], [4, [5, 6, [9,10]]]]] 
datadict = {} 

def toTree(data,depth=0): 
    for elem in data: 
     if not isinstance(elem, int): 
      toTree(elem, depth+1) 
     else: 
      d = depth - 1 if depth > 0 else depth 
      if datadict.get(d): 
       datadict[d] = datadict[d] + [elem] 
      else: 
       datadict[d] = [elem] 

toTree(l) 
print(datadict) 

輸出將

{0:0 ],1:[1,4],2:[2,3,5,6],3:[9,10],4:[7,8,10,11]}

,你可以只使用datadict.get(2)獲得[2,3,5,6]