按层展示
输入一颗二叉树,按层打印该二叉树。
如输入层次序列 1234567#8####9##### ,打印
1
23
4567
89
测试用例:
1234567#8####9#####
1234567########
73914#####5#6##
思路分析
首先回顾一下二叉树的层次遍历:将根节点插入一个队列。循环如下过程,直到队空:每出队一个节点,将该节点的左右子节点入队,若没有左右子那么不进行入队操作。
这样就会输出层次遍历的序列,不难发现只要在上面的逻辑中,加入一个#表示换行的位置,在初始化的时候将根节点和第一个#同时放入队中,节点出队的操作不变,对于#:当遇到#时打印一个换行符,且把一个新的#入队,就可以按行打印。
在实现的时候,可以用一个数组以及两个下标head和tail来模拟队列。
源代码
#include "biTree.h"
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
struct biTree
{
int data;
biTree* leftSon;
biTree* rightSon;
};
void display_biTree(biTree* root)
{
//模拟一个 Queue(biTree)
biTree queue[20];
int head; int tail;
head =0 ; tail = 1 ;
queue[0] = *root;
queue[1].data = -1;
for(head=0;head<20;head++)
{
//左右入自己出
if(queue[head].data != -1)
{
printf(" %d ",queue[head].data);
if(queue[head].leftSon !=NULL)
{
queue[tail+1] = *queue[head].leftSon;
tail ++ ;
}
if(queue[head].rightSon != NULL)
{
queue[tail+1] = *queue[head].rightSon;
tail ++ ;
}
}
else
{
if(tail == head)
return;
else
{
printf("\n");
tail++;
queue[tail].data = -1;
}
}
}
}