本题我们采用让结点出队时将结点入栈,同时访问该结点,是否有左右孩子,如果有的话,就让左右孩子进队。最后所有结点都入栈了,再从栈顶开始依次访问就可以得到结果
看下面的图解
A先入队,然后出队,就压入栈中
访问A结点,有左右孩子,左右孩子入队
B结点出队并入栈,并访问B结点,B结点有左右孩子,左右孩子进队
C结点出队并入栈,同时访问C结点,C结点有左右孩子,左右孩子进队
D结点出队并入栈,同时访问D结点,D结点没有左右孩子
EFG依次出队进栈(与D的步骤相同)
最后我们看一下栈中的元素
我们让栈中元素依次出栈就能得到我们想要的结果
下面我们来看一下代码该如何实现:
void level(tree* t)
{
treenode* q[10];
treenode* s[10];
int top = -1;
int f = -1;
int r = -1;
treenode* p;
q[++r] = *t;//根结点进队
while (f < r)
{
p = q[++f];//结点出队
s[++top] = p;//结点进栈
if (p->lchild)//出队结点是否有左孩子
q[++r] = p->lchild;//有左孩子,左孩子进栈
if (p->rchild)//出队结点是否有右孩子
q[++r] = p->rchild;//有右孩子,右孩子进栈
}
while (top != -1)//依次输出栈中元素
{
printf("%c ", s[top--]->data);
}
}
完整测试代码如下
#include<stdio.h>
#include<stdlib.h>
typedef struct treenode
{
char data;
struct treenode* lchild, * rchild;
}treenode,*tree;
void buildtree(tree* t)
{
char ch;
ch = getchar();
if (ch == '#')
*t = NULL;
else
{
*t = (treenode*)malloc(sizeof(treenode));
(*t)->data = ch;
(*t)->lchild = NULL;
(*t)->rchild = NULL;
buildtree(&(*t)->lchild);
buildtree(&(*t)->rchild);
}
}
void level(tree* t)
{
treenode* q[10];
treenode* s[10];
int top = -1;
int f = -1;
int r = -1;
treenode* p;
q[++r] = *t;
while (f < r)
{
p = q[++f];
s[++top] = p;
if (p->lchild)
q[++r] = p->lchild;
if (p->rchild)
q[++r] = p->rchild;
}
while (top != -1)
{
printf("%c ", s[top--]->data);
}
}
int main()
{
tree t;
buildtree(&t);
level(&t);
return 0;
}
用ABD##E##CF##G##测试