赞
踩
下面是对层次遍历的一个实例,如果对二叉树不太了解请点击这里,另外对于二叉树其他的三种遍历方式:请点击这里
任务要求:输入一棵二叉树,进行层次遍历,每个节点都按照从根节点到他的移动序列给出(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;
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。