我不是程序员,但作为我个人项目的一部分,我很想知道是否有一个递归解决方案能够首先打印二叉树宽度,水平顺序?我理解可以使用迭代深度优先算法吗?
#Helper method
def getChildren(node):
children=[]
hasLeft = node.left is not None
hasRight = node.right is not None
if not hasLeft and not hasRight:
return []
if hasLeft:
children.append(node.left)
if hasRight:
children.append(node.right)
return children
def DLS(node, depth):
"""Depth Limited Search"""
if (depth == 0):
return node
elif (depth > 0):
print node.value,
children = getChildren(node)
for child in children:
DLS(child, depth-1)
else:
return False
对于以下二叉树:
(1)3
(2)2 (3)1
(4)1 (5)1 (6)1 (7)0
(8)1 (9)0
我得到了这个遍历输出:
(1)3 (2)2 (4)1 (8)1 (9)0 (5)1 (3)1 (6)1 (7)0 None
这不是级别顺序,而是先预先订购深度。
我是否必须将深度迭代到DLS
函数?我如何实现二进制树的级别订单打印输出?
非常感谢 亚历
答案 0 :(得分:1)
就数据结构而言,深度优先和广度优先的区别在于深度优先使用堆栈,广度优先使用队列。
在深度优先,这个想法是“处理你处理的最后一件事的后果”。因此,对于堆栈,您始终会弹出最后一个被推送的节点,并且您将获得正确的行为。
在广度优先,这个想法是“首先处理所选节点的所有后果,然后再继续”。因此,您首先要找出后果(并存储它们),然后才能按照找到它们的顺序开始处理它们。支持此操作的最简单的数据结构是队列。
问题是递归使用堆栈(调用堆栈)。所以你没有看到数据结构,但它确实在那里。因为没有(简单)排队调用的方法,所以不能在不使用显式队列的情况下将广度优先搜索转换为代码。
如果您需要有关队列的广度优先实施的信息,建议您查看Wikipedia。