1.题目描述:点击链接
2.问题分析:
简单地来说,就是输入一组字符串,表示二叉树上某些节点的值和位置,这些节点不一定可以组成一颗完整的二叉树,可能出现缺少某个节点或者某个节点冗余的情况。
需要我们进行判断是否能组成一颗完整的二叉树,若可以按照由上到下,由左到右的顺序输出每个节点的值,若不能则输出not complete
3.输入数据分析:
题目上给出节点的个数不超过256个,如果按照最坏的情况去考虑,256个节点组成一条单链,那么最后一个节点的编号会非常大,所以不能用暴力去解决。
4.算法设计:
由于节点的不确定,最好构建一个二叉树,然后往树里添加新的节点,最后使用bfs查找是否存在缺少或者多余的情况。
5.代码:
1 #include<iostream> 2 #include<vector> 3 #include<stdio.h> 4 #include<stdlib.h> 5 #include<cstring> 6 #include<queue> 7 #include<string.h> 8 using namespace std; 9 const int maxn=256+10; 10 char s[maxn]; 11 bool failed; 12 struct Node{ 13 int v; 14 bool have_value; 15 Node *left,*right; 16 Node():have_value(false),left(NULL),right(NULL){} 17 }; 18 Node *root; 19 Node *newnode(){return new Node();} 20 void addnode(int v,char *s){ 21 int n=strlen(s); 22 Node *u=root; 23 for(int i=0;i<n;i++) 24 { 25 if(s[i]=='L'){ 26 if(u->left==NULL)u->left=newnode(); 27 u=u->left; 28 } 29 else if(s[i]=='R'){ 30 if(u->right==NULL)u->right=newnode(); 31 u=u->right; 32 } 33 } 34 if(u->have_value==1) failed=true; 35 u->have_value=1; 36 u->v=v; 37 } 38 bool read_input(){ 39 failed=false; 40 root=newnode(); 41 for(;;){ 42 if(scanf("%s",s)==EOF)return false; 43 if(strcmp(s,"()")==0)break; 44 int v; 45 sscanf(&s[1],"%d",&v); 46 addnode(v,strchr(s,',')+1); 47 } 48 return true; 49 } 50 bool bfs(vector<int>&ans){ 51 queue<Node*>q; 52 ans.clear(); 53 q.push(root); 54 while(!q.empty()){ 55 Node* u=q.front();q.pop(); 56 if(!u->have_value)return false; 57 ans.push_back(u->v); 58 if(u->left!=NULL)q.push(u->left); 59 if(u->right!=NULL)q.push(u->right); 60 } 61 return true; 62 } 63 int main() 64 { 65 freopen("in.txt","r",stdin); 66 while(1) 67 { 68 if(read_input()==0)break; 69 vector<int>ans; 70 if(!failed&&bfs(ans)){ 71 int n=ans.size(); 72 for(int i=0;i<n;i++) 73 printf("%d%c",ans[i],i==n-1?' ':' '); 74 } 75 else{ 76 printf("not complete "); 77 } 78 } 79 return 0; 80 }