PAT1099


/*innner order traverse for BST will be ordered
*1.sort the value in buffer
*2.inner traverse the BST and insert the value
*3.be careful for the formatted output
*4.level traverse output using queue
*/


/*c-style code
* abusing in global variable
*not good encapsulation
*may be possible to use reference for 'start'
*/

 1 #include <cstdio>
 2 #include<algorithm>
 3 #include<cstring>
 4 #include<queue>
 5 #define maxn 100
 6 using  namespace std;
 7 typedef struct {
 8     int left,right;
 9     int value;
10     int inserted;
11 }binode;
12 binode bitree[maxn];
13 int buf[maxn];
14 int start=0;
15 queue<int> q;
16 void middle_insert(int root)
17 {
18     if(root==-1)return;
19     middle_insert(bitree[root].left);
20     if(bitree[root].left==-1 || bitree[bitree[root].left].inserted==1)
21     {
22         bitree[root].value=buf[start];
23         bitree[root].inserted=1;
24         start++;
25         //return ;
26     }
27     middle_insert(bitree[root].right);
28 }
29 void level_traverse()
30 {
31     int i=0;
32     q.push(0);
33     while(!q.empty())
34     {
35         int tmp=q.front();
36         buf[i++]=bitree[tmp].value;
37         q.pop();
38         if(bitree[tmp].left!=-1)q.push(bitree[tmp].left);
39         if(bitree[tmp].right!=-1)q.push(bitree[tmp].right);
40     }
41 }
42 int main()
43 {
44     //freopen("input.txt","r",stdin);
45     int i,n;
46     while(cin>>n)
47     {
48         memset(buf,0,sizeof(buf));
49         memset(bitree,0,sizeof(bitree));
50         //fill(bitree,bitree+n,0); parameter must be iterator
51         for(i=0;i<n;i++)scanf(" %d %d",&bitree[i].left,&bitree[i].right);
52         for(i=0;i<n;i++)scanf(" %d",&buf[i]);
53         sort(buf,buf+n);
54         //for(i=0;i<n;i++)printf("%d ",buf[i]);
55         middle_insert(0);
56         //for(i=0;i<n;i++)printf("%d %d %d %d\n",i,bitree[i].left,bitree[i].right,bitree[i].value);
57         level_traverse();
58         for(i=0;i<n;i++){
59             if(i<n-1)printf("%d ",buf[i]);
60             else printf("%d\n",buf[i]);
61         }
62     }
63     return 0;
64 }

IMPROVE IN  C++

 1 #include <cstdio>
 2 #include <iostream>
 3 #include<algorithm>
 4 #include<cstring>
 5 #include<queue>
 6 #define maxn 100
 7 using  namespace std;
 8 typedef struct {
 9     int left,right;
10     int value;
11     int inserted;
12 }binode;
13 
14 
15 binode bitree[maxn];
16 int buf[maxn];
17 void middle_insert(int root,int &start)
18 {
19     if(root==-1)return;
20     middle_insert(bitree[root].left,start);
21     if(bitree[root].left==-1 || bitree[bitree[root].left].inserted==1)
22     {
23         bitree[root].value=buf[start];
24         bitree[root].inserted=1;
25         start++;
26         //return ;
27     }
28     middle_insert(bitree[root].right,start);
29 }
30 void level_traverse(binode bitree[],int buf[])
31 {
32     queue<int> q;
33     int i=0;
34     q.push(0);
35     while(!q.empty())
36     {
37         int tmp=q.front();
38         buf[i++]=bitree[tmp].value;
39         q.pop();
40         if(bitree[tmp].left!=-1)q.push(bitree[tmp].left);
41         if(bitree[tmp].right!=-1)q.push(bitree[tmp].right);
42     }
43 }
44 int main()
45 {
46 
47     freopen("input.txt","r",stdin);
48     int n;
49     while(cin>>n)
50     {
51         memset(buf,0,sizeof(buf));
52         memset(bitree,0,sizeof(bitree));
53         for(int i=0;i<n;i++)cin>>bitree[i].left>>bitree[i].right;
54         for(int i=0;i<n;i++)cin>>buf[i];
55         sort(buf,buf+n);
56         //for(i=0;i<n;i++)printf("%d ",buf[i]);
57         int start=0;
58         middle_insert(0,start);
59         //for(i=0;i<n;i++)printf("%d %d %d %d\n",i,bitree[i].left,bitree[i].right,bitree[i].value);
60         level_traverse(bitree,buf);
61         for(int i=0;i<n;i++){
62             cout<<buf[i];
63             i==n-1?cout<<endl:cout<<' ';
64         }
65     }
66     return 0;
67 }

 

posted @ 2016-09-01 13:09  zeroArn  阅读(115)  评论(0)    收藏  举报