python - 使用特定格式以级别顺序打印 BFS(二叉树)

标签 python algorithm binary-tree breadth-first-search tree-traversal

首先,这个问题不是 this one 的重复。 ,但建立在它之上。

以该问题中的树为例,

    1 
   / \
  2   3
 /   / \
4   5   6

你会如何修改你的程序来打印它,

1
2 3
4 5 6

而不是一般的

1 
2 
3 
4 
5 
6

我基本上是在寻找最有效方法的直觉——我有一种方法,包括将结果附加到列表中,然后循环遍历它。一种更有效的方法可能是在弹出的每个级别中存储最后一个元素,然后打印出一个新行。

想法?

最佳答案

一次只构建一个级别,例如:

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

def traverse(rootnode):
  thislevel = [rootnode]
  while thislevel:
    nextlevel = list()
    for n in thislevel:
      print n.value,
      if n.left: nextlevel.append(n.left)
      if n.right: nextlevel.append(n.right)
    print
    thislevel = nextlevel

t = Node(1, Node(2, Node(4, Node(7))), Node(3, Node(5), Node(6)))

traverse(t)

编辑:如果您希望在最大消耗的“辅助”内存中节省一点点(在这种“辅助”内存中永远不会同时拥有所有这个级别和下一个级别),您可以当然使用 collection.deque 而不是 list,并在你进行时使用当前关卡(通过 popleft)而不是简单地循环。一次创建一个级别的想法(当您使用 - 或迭代 - 前一个级别时)保持不变 - 当您确实需要区分级别时,它比使用单个大双端队列加上辅助信息更直接(例如深度,或给定级别中剩余的节点数)。

但是,仅附加到(并循环,而不是“消耗”)的列表比双端队列更有效(如果您使用 C++ 解决方案,则类似地, std::vector仅使用 push_back 来构建它,然后使用一个循环来使用它,比 std::deque 更有效)。由于所有的生产首先发生,然后是所有的迭代(或消费),一个有趣的替代方案 if 内存被严格限制可能是使用一个列表来表示每个级别,然后是 .reverse 在你开始使用它之前(使用 .pop 调用)——我没有大树可以通过测量来检查,但我怀疑这种方法仍然会更快(实际上比 deque 更少的内存消耗)(假设 list [[or std::vector]] 的底层实现实际上确实在几次调用 pop [[或 pop_back]]——当然,对双端队列也有同样的假设;-)。

关于python - 使用特定格式以级别顺序打印 BFS(二叉树),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1894846/

相关文章:

使用 ctypes 指向压缩结构中的 uint_64 的 Python 指针地址?

python - 谷歌应用引擎: receive email then/and forward it?

algorithm - 计算从网格中的一个正方形到达另一个正方形的步数,并将其用于 A* 算法中的 h 成本

C圆形阵列

haskell - 在 Haskell 中从左到右对树中所有出现的叶子进行编号

python - 以特定格式打印二叉树

python - 水平条形图 : adjusting y axes label size

python - Matplotlib slider 颜色变化

algorithm - LCOM4询问计算方式

从二叉树创建链表(前序遍历)