题目描述
编一个程序,读入用户输入的一串先序遍历字符串,根据输入建立一棵二叉树, 并输出该二叉树的层次遍历序列。层次遍历是指逐层访问,每一层又按从左到右的次序访问结点。
输入
输入包括1行字符串,长度不超过100。
输出
输出二叉树的层次遍历序列。每个结点先输出一个空格,然后再跟着输出结点的数据。
样例输入
12##3##
样例输出
1 2 3
基本思路: 应用队列存储树的节点,先写入根节点,再写入左右子节点。(若子节点为NULL则不写入) 在对头元素出队前输出其数据域数据,直到队列为空时遍历结束。
注意事项: 队列数据域应设为指向二叉树的指针
代码部分:
#include<stdio.h>
#include<stdlib.h>
#include<iostream>
using namespace std;
struct tree
{
char data;
struct tree*left;
struct tree*right;
};
struct list
{
struct tree*data;
struct list*next;
};
typedef struct list* link;
struct AC
{
link A;
link C;
};
typedef struct tree* T;
typedef struct AC* ac;
ac creat()
{
ac t=(ac)malloc(sizeof(struct AC));
t->A=t->C=(link)malloc(sizeof(struct list));
t->A->next=NULL;
return t;
}
void push(ac &l,T e)
{
link temp=(link)malloc(sizeof(struct list));
temp->data=e;
temp->next=NULL;
l->C->next=temp;
l->C=temp;
}
void pop(ac &l)
{
link temp=l->A->next;
l->A->next=temp->next;
if(temp==l->C)
l->C=l->A;
delete temp;
}
char top(ac l)
{
T m=l->A->next->data;
return m->data;
}
void BiTree(T &tree)
{
char ch;
cin>>ch;
if(ch=='#')
tree=NULL;
else
{
tree=(T)malloc(sizeof(struct tree));
tree->data=ch;
BiTree(tree->left);
BiTree(tree->right);
}
}
int empty(ac l)
{
if(l->A==l->C)
return 0;
return 1;
}
void fx(ac k)
{
T temp;
while(empty(k))
{
temp=k->A->next->data;
if(temp->left)
push(k,temp->left);
if(temp->right)
push(k,temp->right);
printf(" %c",top(k));
pop(k);
}
}
int main()
{
ac x=creat();
T tree;
BiTree(tree);
if(tree!=NULL) //这个判断语句可有可无,根据实际oj环境而定
{
push(x,tree);
fx(x);
}
return 0;
}