【问题标题】:Converting a list of nested lists in binary tree转换二叉树中嵌套列表的列表
【发布时间】:2017-05-24 16:38:08
【问题描述】:

在 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 中对二叉树进行更标准的管理,也许将我的列表转换为其他东西?

【问题讨论】:

  • 看看这是否有帮助:github.com/joowani/binarytree
  • 请注意,您可以使用collections.defaultdict: def tree(): return defaultdict(tree) 来构建树。通过[some_element] 访问元素。因为您想要某个级别的所有元素,所以我认为除了从最顶部开始遍历树直到指定级别(这就是您所说的“蛮力”的意思吗?)之外别无他法。
  • 称为水平顺序遍历。谷歌一下,你会找到很多答案

标签: python list tree binary-search-tree


【解决方案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


# uncomment for python 2
# print getLevel(0, L)
# print getLevel(1, L)
# print getLevel(2, L)

# uncomment python 3
print(getLevel(0, L))
print(getLevel(1, L))
print(getLevel(2, L))

【讨论】:

    【解决方案2】:

    我的解决方案会解析成字典

    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]

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多