小白书之二叉树指针法构建二叉树以及二叉树先序遍历

来源:互联网 发布:按键精灵免费网络验证 编辑:程序博客网 时间:2024/05/01 18:14
#include<iostream>#include<cstdio>#include<cstring>#include<cstdlib>#include<string>#include<cctype>#include<cmath>#include<map>#include<set>#include<vector>#include<queue>#include<stack>#define LL __int64using namespace std;const double pi=4*atan(1.0);const int MAXN=1001;/*typedef struct TNode{    int have_value;    int v;    struct TNode *left,*right;}Node;Node *root;Node* newnode(){    Node *u=(Node *)malloc(sizeof(Node));    if(u!=NULL)    {        u->have_value=0;        u->left=u->right=NULL;    }    return u;}int failed=0;void addnode(int v,char *s){   // cout<<"hehe"<<endl;    int n=strlen(s);    Node* u=root;   // cout<<s<<endl;    for(int i=0;i<n;i++)    {        if(s[i]=='L')        {            if(u->left==NULL)                u->left=newnode();            u=u->left;        }        else if(s[i]=='R')        {            if(u->right==NULL)                u->right=newnode();            u=u->right;        }     //   cout<<"hehe"<<endl;    }    if(u->have_value) failed=1;    u->v=v;    u->have_value=1;}char s[maxn+10];int read_input(){    failed=0;    root=newnode();    for(;;)    {        if(scanf("%s",s)!=1) return 0;        if(!strcmp(s,"()")) break;        int v;        sscanf(&s[1],"%d",&v);        addnode(v,strchr(s,',')+1);    }    return 1;}int n=0,ans[maxn];int bfs(){    int front=0,rear=1;    Node *q[maxn];    q[0]=root;    while(front<rear)    {        Node *u=q[front++];        if(!u->have_value) return 0;        ans[n++]=u->v;        if(u->left!=NULL) q[rear++]=u->left;        if(u->right!=NULL) q[rear++]=u->right;    }    return 1;}void remove_tree(Node *u){    if(u==NULL) return;    remove_tree(u->left);    remove_tree(u->right);    free(u);}int main(){    while(read_input())    {      //  cout<<"hehe"<<endl;        if(failed||!bfs())        {            cout<<-1<<endl;        }        else        {           for(int i=0;i<n;i++)                cout<<ans[i]<<' ';           cout<<endl;        }        remove_tree(root);    }    return 0;}*/int have_value[MAXN];int v[MAXN];int lleft[MAXN],rright[MAXN];const int root=1;int cnt;int failed;void newtree(){    lleft[root]=rright[root]=0;cnt=root;}int newnode(){    int u=++cnt;    lleft[u]=rright[u]=0;    return u;}void addnode(int t,char *s){    int n=strlen(s);    int u=root;    for(int i=0;i<n;i++)    {        if(s[i]=='L')        {            if(!lleft[u])            {                lleft[u]=newnode();            }            u=lleft[u];        }        if(s[i]=='R')        {            if(!rright[u])            {                rright[u]=newnode();            }            u=rright[u];        }    }    if(have_value[u]) failed=1;    v[u]=t;    have_value[u]=1;}char s[MAXN];int read_input(){    newtree();    memset(have_value,0,sizeof(have_value));    failed=0;    for(;;)    {        if(scanf("%s",s)!=1) return 0;        if(!strcmp(s,"()")) break;        int v;        sscanf(&s[1],"%d",&v);        addnode(v,strchr(s,',')+1);    }    return 1;}int n,ans[MAXN];int bfs(){    n=0;    int front=0,rear=1;    int q[MAXN];    q[0]=1;    while(front<rear)    {        int u=q[front++];     //   cout<<u<<endl;        if(!have_value[u]) return 0;        ans[n++]=v[u];        if(lleft[u]) q[rear++]=lleft[u];        if(rright[u]) q[rear++]=rright[u];    }    return 1;}int main(){    while(read_input())    {      //  for(int i=1;i<=cnt;i++)       //     cout<<v[i]<<' ';        if(failed||!bfs())        {            cout<<-1<<endl;        }        else        {            for(int i=0;i<n;i++)                cout<<ans[i]<<' ';            cout<<endl;        }    }    return 0;}

0 0