学到很多的题目。
利用ssrand使处理数据更加方便,动态管理内存的做法也值得学习。
1 #include <iostream> 2 #include <string> 3 #include <algorithm> 4 #include <cstring> 5 #include <cstdio> 6 #include <cmath> 7 #include <queue> 8 #include <set> 9 #include <map> 10 #include <list> 11 #include <stack> 12 #define mp make_pair 13 typedef long long ll; 14 typedef unsigned long long ull; 15 const int MAX=300; 16 const int INF=1e9+5; 17 using namespace std; 18 typedef pair<int,int> pii; 19 char temp[MAX]; 20 bool st; 21 int an[MAX],ge; 22 struct Node 23 { 24 bool vi; 25 int value; 26 Node *left,*right; 27 Node():vi(false),left(NULL),right(NULL){} 28 }; 29 Node *root; 30 Node *newnode() 31 { 32 return new Node(); 33 } 34 void addnode(int val,char *s) 35 { 36 int len=strlen(s); 37 Node *u=root; 38 for(int i=0;i<len-1;i++) 39 { 40 if(s[i]=='L') 41 { 42 if(u->left==NULL) 43 u->left=newnode(); 44 u=u->left; 45 } 46 else if(s[i]=='R') 47 { 48 if(u->right==NULL) 49 u->right=newnode(); 50 u=u->right; 51 } 52 } 53 if(u->vi) 54 st=false; 55 u->value=val; 56 u->vi=true; 57 } 58 bool bfs() 59 { 60 ge=0; 61 queue<Node *>que; 62 que.push(root); 63 while(!que.empty()) 64 { 65 Node *tem=que.front();que.pop(); 66 if(!tem->vi) 67 return false; 68 an[++ge]=tem->value; 69 if(tem->left!=NULL) 70 que.push(tem->left); 71 if(tem->right!=NULL) 72 que.push(tem->right); 73 } 74 return true; 75 } 76 void remove_tree(Node *u) 77 { 78 if(u==NULL) 79 return; 80 remove_tree(u->left);remove_tree(u->right); 81 delete u; 82 } 83 int main() 84 { 85 while(1) 86 { 87 st=true;root=newnode(); 88 while(1) 89 { 90 if(scanf("%s",temp)!=1) 91 exit(0); 92 if(!strcmp(temp,"()")) 93 break; 94 int v; 95 sscanf(&temp[1],"%d",&v); 96 addnode(v,strchr(temp,',')+1); 97 } 98 if(bfs()&&st) 99 { 100 for(int i=1;i<=ge;i++) 101 { 102 if(i!=1) 103 printf(" "); 104 printf("%d",an[i]); 105 } 106 } 107 else 108 printf("not complete"); 109 printf(" "); 110 remove_tree(root); 111 } 112 }