1. 程式人生 > >UVa 122 - Trees on the level(BFS層序遍歷 &&strchr&&sscanf)

UVa 122 - Trees on the level(BFS層序遍歷 &&strchr&&sscanf)

題目連結:

 

 原型: 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;
}