Uva 122 Trees on the level
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Uva 122 Trees on the level相关的知识,希望对你有一定的参考价值。
题意:读入xx的数据,建立一棵二叉树,若成功建立无错误,则输出其层序遍历。
讲一下处理吧。
首先是输入那么就是input函数。我们不停的读入一个函数,如果输入正确的话,对于一组数据而言应该是读到()为止,所以把s=="()"作为一组数据读入结束的标志,return一个true给主函数,进行该组数据的操作,但是如果输入全部结束的时候,应该是读入为空 所以return一个false给主函数。
在读进一组数据的一个结点的内容的时候,利用sscanf(s[1],"%d",&v)读出该结点的值。再利用strchr(s,‘,‘)得到s这个字符串中第一个逗号的地址,则strchr(s,‘,‘)+1就是后面代表该结点位置的部分字符串的起始地址了。
那么已知一个结点的值和位置,就可以添加结点了,即执行addnode(v,postion)函数了。
首先新建一个结点指向根节点,根据代表postion的字符串s‘来不断模拟,若s’[i]==L 那么进入左子树,但是要先判断左子树是否存在,不存在则创建一个新的,再进入该左子树。右子树同理。当s‘的内容读完之后,就是到达要添加的结点的位置了,把它的权值修改为v即可。
那么树已经建立了,接下来是层序遍历,层序遍历都是利用了队列来处理。
接下来要注意的是过程当中哪些因素使得输入为错误,而输出not complete
0.重复输入某一个结点的数据,即addnode函数中的
if(u->vis) error=true;
1.取出的结点,竟然没有被访问过。(因为每次建立结点时要记录u->vis=true,否则就说明该结点只被建立了,但是没有对应的权值,即输入出现了问题)
Node* u =q.front();q.pop(); if(!u->vis) return false;
另外,注意bfs函数当中每次vector因为是全局变量所以要重新清空
vector<int>ans;
ans.clear();
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <vector> 5 #include <queue> 6 #include <string.h> 7 using namespace std; 8 const int maxn=300; 9 bool error; 10 vector<int>ans; 11 char s[maxn]; 12 struct Node 13 { 14 bool vis; 15 int v;// 16 Node *left, *right; 17 Node():vis(false),left(NULL),right(NULL){} 18 }; 19 20 Node *root; 21 Node *newnode(){return new Node();} 22 23 void addnode(int v,char* s) 24 { 25 int n=strlen(s); 26 Node *u=root; 27 for(int i=0;i<n;i++) 28 { 29 if(s[i]==‘L‘) 30 { 31 if(u->left == NULL) 32 u->left=newnode(); 33 u=u->left; 34 } 35 else if(s[i]==‘R‘) 36 { 37 if(u->right==NULL) 38 u->right=newnode(); 39 u=u->right; 40 } 41 } 42 43 if(u->vis) error=true; 44 u->v=v; 45 u->vis=true; 46 47 48 } 49 bool input() 50 { 51 52 error=false; 53 root=newnode(); 54 for(;;) 55 { 56 if(scanf("%s",s)!=1) return false; 57 if( !strcmp(s,"()") ) break; 58 int v; 59 sscanf(&s[1],"%d",&v); 60 addnode( v, strchr(s,‘,‘)+1 ); 61 62 } 63 return true; 64 } 65 bool bfs(vector<int>& ans) 66 { 67 queue<Node*> q; 68 ans.clear(); 69 q.push(root); 70 while(!q.empty()) 71 { 72 Node* u =q.front();q.pop(); 73 if(!u->vis) return false;//**????? 74 ans.push_back(u->v); 75 if(u->left != NULL) 76 q.push(u->left); 77 if(u->right != NULL) 78 q.push(u->right); 79 } 80 return true; 81 } 82 void show() 83 { 84 int t=0; 85 for(int i=0; i<ans.size(); i++) 86 { 87 if(i) printf(" "); 88 printf("%d",ans[i]); 89 } 90 printf("\n"); 91 ans.clear(); 92 } 93 int main() 94 { 95 while(input()) 96 { 97 bfs(ans); 98 if(error||!bfs(ans)) printf("not complete\n"); 99 else show(); 100 } 101 return 0; 102 } 103 /* 104 (11,LL) (7,LLL) (8,R) (5,) (4,L) (13,RL) (2,LLR) (1,RRR) (4,RR) () 105 (3,L) (4,R) () 106 */
以上是关于Uva 122 Trees on the level的主要内容,如果未能解决你的问题,请参考以下文章
UVA 122 -- Trees on the level (二叉树 BFS)