标签:
下面是对层次遍历的一个实例,如果对二叉树不太了解请点击这里
任务要求:输入一棵二叉树,进行层次遍历,每个节点都按照从根节点到他的移动序列给出(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; }
标签:
原文地址:http://blog.csdn.net/luomingjun12315/article/details/45217001