【问题标题】:Print Levels Of A Binary Tree by Level Iteratively以迭代方式按级别打印二叉树的级别
【发布时间】:2014-04-26 08:38:36
【问题描述】:

我想逐级迭代地打印二叉树,而不使用出队或除 python 列表之外的任何其他数据结构。我在网上看过,大多数都是上面提到的方法之一。

如果我有一棵树:

    41
   /  \
  7   53
 / \  /
1  19 47

我希望它像这样打印:

41

7
53

1
19
47

这是我的尝试,但它不会打印出 bst 中的所有值:

def levelorder(self):

        current = self._root
        current_left = current_right = self._root
        a = [current._value]

        while current_left is not None and current_right is not None:

            current_left = current_left._left
            current_right = current_right._right

            if current_left is not None:
                a.append(current_left._value)

            if current_right is not None:
                a.append(current_right._value)

        return a

这是它的输出:

[41, 7, 53, 1]

知道我的代码有什么问题吗?以及如何解决这个问题?

树类:

class _BSTNode:

    def __init__(self, value):

        self._value = copy.deepcopy(value)
        self._left = None
        self._right = None
        self._height = 1
        return

class BST:

    def __init__(self):

        self._root = None
        self._count = 0
        self.comparisons = 0
        return

    def levelorder(self):


        levels = [[self._root]]

        while levels[-1]:

            nextlevel = []
            for node in levels[-1]:
                nextlevel.extend([node for node in (node._left, node._right) if node])

            levels.append(nextlevel)
        return levels[:-1]

和我的主要部分:

b = BST()
b.insert(41)
b.insert(7)
b.insert(53)
b.insert(1)
b.insert(19)
b.insert(47)

print (b.levelorder())

【问题讨论】:

标签: python python-3.x binary-search-tree


【解决方案1】:

未经测试,因为我没有您的 Tree 课程,但我希望总体思路适用:

def levelorder(tree):
    levels = [ [tree.root] ]
    while levels [-1]:
        nextLevel = []
        for node in levels [-1]:
            nextLevel.extend ( [node for node in (node.left, node.right) if node] )
        levels.append (nextLevel)
    return levels # or maybe levels [:-1]

完整的工作示例:

#! /usr/bin/python3

class Node:
    def __init__(self, payload, left = None, right = None):
        self.payload = payload
        self.left = left
        self.right = right

    def __repr__(self):
        return self.payload

class Tree:
    def __init__(self, root):
        self.root = root

    def levels(self):
        levels = [[self.root]]
        while levels[-1]:
            nextLevel = []
            for node in levels[-1]:
                nextLevel.extend([node for node in (node.left, node.right) if node])
            levels.append(nextLevel)
        return levels[:-1]

t = Tree(Node('41', Node('7', Node('1'), Node('19')), Node('53', Node('47'))))

print(t.levels())

输出为[[41], [7, 53], [1, 19, 47]]

【讨论】:

  • 如果我发布我的树类,你能编辑上面的解决方案吗?我仍然在实施方面遇到了一些问题。
  • 您的示例对我的理解有所帮助,但我的仍然返回一个列表,其中包含 <__main__._bstnode object at> 等。我已将我的树类添加到原始问题中。有什么想法我仍然做错了吗?
  • @Kalvin94 我的代码还返回了Node 对象列表的列表,只是我已经实现了__repr__。获取最终输出,访问每个成员的_value,然后您就设置好了。类似\n\n'.join ('\n'.join (node._value for node in level) for level in tree.levels () )
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-10-22
  • 1970-01-01
  • 2023-03-29
  • 1970-01-01
  • 1970-01-01
  • 2010-12-26
  • 1970-01-01
相关资源
最近更新 更多