UVa 122 - Trees on the level(BFS層序遍歷 &&strchr&&sscanf)
阿新 • • 發佈:2018-11-16
原型: char *strchr(const char *s,char c);
#include<string.h>
查詢字串s中首次出現字元c的位置,返回首次出現c的位置的指標(可以當作陣列),如果s中不存在c則返回NULL。
1.sscanf的用法:
s={"(11,LL)"}; int v;
則:sscanf(&s[1],"%d",&v); 會將11賦值與int型資料v;
2.strchr
strchr(s,','); 其中s是字元陣列名,返回的值為陣列第一次出現的位置座標;
m=strchr(s,',')-s; 則m=3。
#include<iostream> #include<vector> #include<cstdio> #include<new> #include<cstring> #include<queue> #define maxn 100000 using namespace std; struct Node{ int v;//節點值 bool have_value;//是否被賦值過 Node *left,*right; Node():have_value(false),left(NULL),right(NULL){}; }; Node* root; char s[maxn];//儲存輸入的節點 bool failed=false; void addnode(int v,char *s){ int n=strlen(s); Node* u=root;//從根節點開始往下走 for(int i=0;i<n;i++){ if(s[i]=='L'){ if(u->left==NULL)u->left=new Node();//節點不存在,建立新節點 u=u->left; } else if(s[i]=='R'){ if(u->right==NULL)u->right=new Node();//節點不存在,建立新節點 u=u->right; }//忽略其他情況,即最後那個多餘的又括號 } if(u->have_value) failed=true; u->v=v; u->have_value=true; } bool read_input(){ failed=false; root=new Node();//建立根節點 for(;;){ if(scanf("%s",s)!=1) return false;//輸入結束 if(strcmp(s,"()")==0)break;//讀到結束標誌,退出迴圈 int v; sscanf(&s[1],"%d",&v);//讀入節點值 addnode(v,strchr(s,',')+1);//查詢逗號,然後插入節點(函式strchr(s,‘,’)返回字串s中從左往右第一個‘,’的指標) } return true; } bool bfs(vector<int>& ans){ queue<Node*> q; ans.clear(); q.push(root);//初始時只有一個節點 while(!q.empty()){ Node *u=q.front(); q.pop(); if(!u->have_value) return false;//有節點沒有被賦值過,表明輸入錯誤 ans.push_back(u->v);//增加到輸出序列尾部 if(u->left!=NULL) q.push(u->left);//把左子節點(如果有)放入佇列; if(u->right!=NULL) q.push(u->right);//把右子節點(如果有)放入佇列; } return true;//輸入正確; } int main(){ while(read_input()){ if(failed) printf("not complete\n"); else{ vector<int>ans; if(bfs(ans)){ for(vector<int>::iterator i=ans.begin();i!=ans.end();i++){ if(i!=ans.begin()) printf(" "); printf("%d",*i); } printf("\n"); } else printf("not complete\n"); } } return 0; }