数据结构实验之二叉树七:叶子问题
Time Limit: 1000MS Memory limit: 65536K
题目描述
已知一个按先序输入的字符序列,如abd,,eg,,,cf,,,(其中,表示空结点)。请建立该二叉树并按从上到下从左到右的顺序输出该二叉树的所有叶子结点。
输入
输入数据有多行,每一行是一个长度小于
50
个字符的字符串。
输出
按从上到下从左到右的顺序输出二叉树的叶子结点。
示例输入
abd,,eg,,,cf,,, xnl,,i,,u,,
示例输出
dfg uli
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef char telemtype;
typedef char status;
typedef struct bitnode
{
telemtype data;
struct bitnode *lchild, *rchild;
}*bitree;
char c[55];
int i;
void create(bitree &t)
{
char ch = c[i++];
if(ch==',') t=NULL;
else
{
t = (bitnode *)malloc(sizeof(bitnode));
t->data = ch;
create(t->lchild);
create(t->rchild);
}
}
typedef bitree qelemtype;
typedef struct qnode
{
qelemtype data;
qnode *next;
}*queueptr;
typedef struct
{
queueptr front;
queueptr rear;
}lq;
void initq(lq &q)
{
q.front = q.rear = (queueptr)malloc(sizeof(qnode));
if(!q.front) exit(0);
q.front -> next = NULL;
}
void enq(lq &q, qelemtype &e)//e前一定要加取地址符,否则死循环
{
queueptr p;
p = (queueptr)malloc(sizeof(qnode));
if(!p) exit(0);
p->data = e;
p->next = NULL;
q.rear->next = p;
q.rear = p;
}
status outq(lq &q, qelemtype &e)//e前一定要加取地址符,否则死循环
{
queueptr p;
if(q.front == q.rear)
return 0;
p = q.front->next;
e = p->data;
q.front->next = p->next;
if(q.rear == p)
q.rear = q.front;
free(p);
}
int emptyq(lq &q)
{
if(q.front == q.rear)
return 1;
else
return 0;
}
void traverse(bitree &t)
{
lq q;
bitree p;
p=t;
initq(q);
if(p)
enq(q, p);
while(!emptyq(q))
{
outq(q, p);
if(!p->lchild&&!p->rchild)//叶子结点判定条件
printf("%c", p->data);
if(p->lchild)
enq(q, p->lchild);
if(p->rchild)
enq(q, p->rchild);
}
}
int main()
{
bitree t;
int n;
scanf("%d", &n);
while(~scanf("%s", c))
{
i=0;
create(t);
traverse(t);
printf("\n");
}
return 0;
}