下面是对层次遍历的一个实例,如果对二叉树不太了解请点击这里,另外对于二叉树其他的三种遍历方式:请点击这里
任务要求:输入一棵二叉树,进行层次遍历,每个节点都按照从根节点到他的移动序列给出(L表示左,R表示右)。在输入中,每个节点的左右括号之间没有空格,相邻节点之间用一个空格隔开。每棵数的输入用一队空括号 () 表示结束(这对括号本身并不代表一个节点),如图所示。
(画的略丑)
注意:如果从根到某个叶节点的路径上有的节点没有在输入中给出,或者给出超出了一次应当输出 -1.节点数不超过 256.
样例输入:
(11,LL) (7,LLL) (8,R) (5,) (4,L) (13,RL) (2,LLR) (1,RRR) (4,RR) ()
(3,L) (4,R) ()
样例输出:
5 4 8 11 13 4 7 2 1
-1
代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXN 1500 + 100
typedef struct TNode //定义树结构
{
bool is_value; //是否被赋值过
int v; //节点值
TNode *left, *right;//左儿子和右儿子
}Node;
Node* root; //二叉树的根节点
bool failed;
int ans[MAXN],cnt;
//功能:申请新节点并初始化
Node* newnode(){
Node* u = (Node*)malloc(sizeof(Node));
if(u != NULL ){
u->is_value = false;
u->left = u->right = NULL;
}
return u;
}
//功能:程序运行结束之前先释放内存
void remove_tree(Node* u){
if(u == NULL) return ;
remove_tree(u->left);
remove_tree(u->right);
free(u);
}
//功能:将给定的序列加入树,若不存在则使用newnode创建新节点
void addnode(int v,char *s){
int nLen = strlen(s);
Node* u = root; //从根节点往下走
for(int i = 0; i < nLen; i++){
if(s[i] == 'L'){
if(u->left == NULL) u->left = newnode(); //节点不存在,建立新节点
u = u->left; //往左走
}else if(s[i] == 'R'){
if(u->right == NULL) u->right = newnode();
u = u->right; //往右走
}
} //忽略其他情况,即最后那个多余的括号
if(u->is_value) failed = true; //已经赋过值,表明输入有误
u->v = v;
u->is_value = true;
}
void input_tree(){
char s[MAXN]; //保存读入节点
failed = false;
root = newnode(); //创建根节点
while(scanf("%s",s),strcmp(s,"()")){ //读到结束标志退出循环
int v;
sscanf(&s[1],"%d",&v); //读入节点值
addnode(v,strchr(s,',')+1); //查找逗号,插入节点
}
return ;
}
bool bfs(){
Node *q[MAXN],*u;
q[0] = root;
int front = 0, rear = 1;
while(front < rear){
u = q[front++];
if(!u->is_value) return false; //没有被赋过值,表明输入有误
ans[cnt++] = u->v; //增加到输出序列的尾部
if(u->left != NULL) q[rear++] = u->left; //把左儿子放入队列
if(u->right != NULL) q[rear++] = u->right;//把右儿子放入队列
}
return true; //输入正确
}
int main(){
while(1){
cnt = 0;
input_tree();
if(!failed&&bfs()){ //判断是否有重复输入或者节点中断
for(int i = 0; i < cnt; i++){ //按照层次遍历输出二叉树
if(i) printf(" ");
printf("%d",ans[i]);
}
printf("\n");
}
else
printf("-1\n");
}
return 0;
}