2017-01-10 60 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]