给一个二叉树root,从root开始,按照层序从上到下,从左到右打印。
对于先序创建的二叉树:124##5##3
层序遍历节点的顺序为:12345
设计一个能够完成这样的任务的执行步骤:
由root,开始,打印root//第一层
打印root.left
打印root.right//第二层
再打印root.left.left
再打印root.left.right
在打印root.right.left
再打印root.right.right//第三层
依次类推下去
设计一个方法:levelorder(Node n)
后面的总要用到前面的保留的信息。想到使用栈记录。
这种思路户陷入到陷阱中!
正确的思路是:拿出当前的根节点,打印,判定其是否有孩子,如果有则将左孩子和有孩子放在依次进入到队列中。取队头,打印,继续判定其孩子的情况。直到队列为空。
一种算法需要考虑如何结束,而不能永无止境依靠手工一行一行代码堆积去实现。
“队列为空”就是终止的标志。
那么将以上的思路用伪代码写下了:
levelOrder(node root)
{
if(root!=null)
enqueue(root);//根入队列
while(queue is not empty)//队列不空
{
if(head.left!=null) enqueue(head.left);//队头有左孩子
if(head.right!=null) enqueue(head.right);//队头有右孩子
print(outqueue());//队头出队,打印
}
}