不考虑换行的情况下,广度优先的方法遍历二叉树结点的顺序和分层打印二叉树的顺序是一样的。因此,我们可以考虑修改广度优先遍历二叉树来实现分层打印二叉树。仔细观察可以发现,使用队列来对二叉树进行广度优先遍历时,队列中最多只包含两个邻接层的节点。要实现题目的要求,也就是换行打印,只需要知道某一层最后一个节点就可以了,对于根结点很容易,最后一个结点就是根结点。访问顺序中下一层的结点紧跟当前层的最后一个结点,由此可以知道,在将当前层的所有结点挨个弹出队列并将其左右孩子放入队列时可以记录下下一层的最后一个结点。由归纳法的思想可以知道,在访问某一层之前,这一层的最后一个结点可以确定。所以,当遇到最后一个结点时,输出换行符就可以了。代码如下:

 1 void PrintAllNodeByLevel(Node *root)
2 {
3 if(root == NULL)
4 return;
5 std::queue<Node*> q;
6 Node *tail, *old_tail, *p;
7 tail = root;
8 q.push(root);
9 while(!q.empty())
10 {
11 old_tail = tail;
12 tail = NULL;
13 while(true)
14 {
15 p = q.front();
16 q.pop();
17 printf("%d ", p->val);
18 if(p->lchild != NULL)
19 {
20 q.push(p->lchild);
21 tail = p->lchild;
22 }
23 if(p->rchild != NULL)
24 {
25 q.push(p->rchild);
26 tail = p->rchild;
27 }
28 if(p == old_tail)
29 {
30 printf("\n");
31 break;
32 }
33 }
34 }
35 }

  

posted on 2011-07-19 23:17  raz0r89  阅读(195)  评论(0)    收藏  举报