从上往下打印出二叉树的每个节点,同层节点从左至右打印。
其实这就是广度搜索。
与广度搜索对应的是深度搜索,所谓深度搜索就是前序遍历,除了常见的递归实现之外,还可以利用栈来实现:利用栈,先将根入栈,再将根出栈,并将根的右子树,左子树存入栈,按照栈的先进后出规则来实现深度优先遍历。深度优先搜索不能用都队列来实现,比如一个结点出队列了,它的子树在队尾入队列,就不能紧接着出队列了。
def DFS_STACK(self,root): #基于栈数据结构实现的深度遍历
if root == None:
return
stack = []
stack.append(root)
while stack:
now_node = stack.pop()
print(now_node.data)
if now_node.right != None:
stack.append(now_node.right)
if now_node.left != None:
stack.append(now_node.left)
相对的广度优先搜索就是层次遍历,所谓层次遍历就是把一棵二叉树当成千层饼,吃的时候是一层一层的吃。
广度搜索可以用队列实现,广度优先搜索首先是上面的层要先输出,所以处在上面的要先进队列。在同一层中,左边的结点要先输出所以同一层里左边的结点要先进队列。
这个过程,进出队列是同时进行的。一个结点出队列,它的两个子结点(不管是不是空结点)就进队列。
这个过程怎么理解? 一个结点在它自己这层的出队列次序,代表着它的子结点在下一层的出队列次序。如果把出对列和入队列看成一次遍历的话,父节点出队列的同时,子结点就应该入队列。
换句话解释:如果这个队列只入队列不出队列,当一层入完了,下一层该怎么入?应该是把上一层的结点再找出来,依次把他们的子结点在入队列。这个再找出来的操作就是出队列。
def PrintFromTopToBottom(self, root):
# write code here
# 存储数值的队列
res = []
# 存储结点的队列
queue = [root]
while queue:
node = queue.pop(0)
# 因为不是完全二叉树,有空的跳过
if node == None:
continue
res.append(node.val)
# 子结点入队列
queue += [node.left, node.right]
return res