题目链接:UVA 122 Tree on the level
输入一颗二叉树,你的任务是从上到下,从左到右的顺序输出各个节点的值。每个节点都按照从根节点到它的移动序列给出(L,表示做,R表示右)。在输入中,每个节点的左括号和右括号之间没有空格,相邻节点之间用一个空格隔开。每棵树的输入用一对空括号“()”结束。
注意: 如果从根到某个节点的路径上有的节点没有在输入中给出,或者给出超过1次,应当输出 not complete ,节点个数不超过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 not complete
大家结合代码来看吧,有详细的注释。
#include<cstdio> #include<iostream> #include<cstdlib> #include<cstring> #include<string> using namespace std; const int maxn = 1500 + 100; struct Node{ bool is_value; //是否被赋值过 int v; //节点值 Node *left ,*right; Node():is_value(0),left(NULL),right(NULL){} }; Node* root; Node* newnode(){ return new Node();} //如果申请失败,返回的是NULL bool failed; //表示是否失败 int ans[maxn],cnt; //储存节点的数组,和计数器 void remove_tree(Node* u){ //释放内存 if(u == NULL) return ; remove_tree(u->left); remove_tree(u->right); delete(u); } 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; //如果已经赋值 ,标记failed u->v = v; u->is_value = true; } bool input_tree(){ char s[maxn]; failed = false; root = newnode(); for(;;){ if(scanf("%s",s) !=1 ) return false; if(!strcmp(s,"()"))break; int v; sscanf(&s[1],"%d",&v); //从(后面的数字开始读取, 将数字读取到v; addnode(v,strchr(s,',')+1); //这里体现了字符数组的方便, 指向字符的指针可以直接看做字符串,从该位置开始到'\0' //strchr返回字符串中 所查找字符位置的指针,也就是返回 “,” 后面的字符串 } return true; } 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; //将头结点加入ans 或者输出 if(u->left != NULL) q[rear++] = u->left; //将子节点加入队列 if(u->right != NULL) q[rear++] = u->right; } return true; } int main(){ while(1){ cnt = 0; if(!input_tree()) break; if(!failed && bfs()){ for(int i = 0;i < cnt; i++){ if(i) printf(" "); printf("%d",ans[i]); } printf("\n"); } else{ printf("not complete\n"); } remove_tree(root); } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/chaiwenjun000/article/details/48084993