1. 程式人生 > >團體程序設計天梯賽 L2-006. 樹的遍歷 L2-011. 玩轉二叉樹

團體程序設計天梯賽 L2-006. 樹的遍歷 L2-011. 玩轉二叉樹

sca urn post 程序設計 pos 樹的遍歷 stdlib.h con gpo

L2-006. 樹的遍歷

 1 #include <stdio.h> 
 2 #include <stdlib.h>
 3 #include <string.h>
 4 #include <stdbool.h>
 5 
 6 struct node
 7 {
 8     long left,right;
 9 }tree[10000];
10 
11 long a[31],b[31];
12 
13 void work(long l,long r,long p,long q,long fa,long cond)
14 {
15     long root=a[r],pos;
16 for (pos=p;pos<=q;pos++) 17 if (b[pos]==root) 18 break; 19 if (cond==1) 20 tree[fa].left=root; 21 else 22 tree[fa].right=root; 23 if (p<=pos-1) 24 work(l,l+pos-1-p,p,pos-1,root,1); 25 if (pos+1<=q) 26 work(l+pos-p,r-1
,pos+1,q,root,2); 27 } 28 29 int main() 30 { 31 long i,head,tail,n; 32 long q[31]; 33 scanf("%ld",&n); 34 for (i=1;i<=n;i++) 35 { 36 scanf("%ld",&a[i]); 37 tree[a[i]].left=0; 38 tree[a[i]].right=0; 39 } 40 for (i=1;i<=n;i++) 41 scanf("
%ld",&b[i]); 42 work(1,n,1,n,0,0); 43 44 head=0; 45 tail=1; 46 q[1]=a[n]; 47 while (head<tail) 48 { 49 head++; 50 printf("%ld",q[head]); 51 if (tree[q[head]].left!=0) 52 { 53 tail++; 54 q[tail]=tree[q[head]].left; 55 } 56 if (tree[q[head]].right!=0) 57 { 58 tail++; 59 q[tail]=tree[q[head]].right; 60 } 61 if (head!=tail) 62 printf(" "); 63 } 64 return 0; 65 }

L2-011. 玩轉二叉樹

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 
 4 struct node
 5 {
 6     long left,right;
 7 }tree[301];
 8 
 9 long a[301],b[301],q[301];
10 
11 void work(long x,long y,long p,long q,long father,long cond)
12 {
13     long pos,count;
14     if (father!=0)
15     {
16         if (cond==1)
17             tree[father].left=b[p];
18         else
19             tree[father].right=b[p];
20     }
21     for (pos=x;pos<=y;pos++)
22         if (a[pos]==b[p])
23             break;
24     count=pos-x;
25     if (count>0)
26         work(x,pos-1,p+1,p+count,b[p],1);
27     if (y-pos>0)
28         work(pos+1,y,p+count+1,q,b[p],2);
29 }
30 
31 void change(long d)
32 {
33     if (tree[d].left==0 && tree[d].right==0)
34         return ;
35     long temp;
36     temp=tree[d].left;
37     tree[d].left=tree[d].right;
38     tree[d].right=temp;
39     change(tree[d].left);
40     change(tree[d].right);
41 }
42 
43 int main()
44 {
45     long n,i,head,tail;
46     scanf("%ld",&n);
47     for (i=1;i<=n;i++)
48         scanf("%ld",&a[i]); //mid
49     for (i=1;i<=n;i++)
50         scanf("%ld",&b[i]);    //pre
51     for (i=1;i<=n;i++)
52     {
53         tree[i].left=0;
54         tree[i].right=0;
55     }    
56     work(1,n,1,n,0,0);
57     change(b[1]);
58     
59     head=0; tail=1;
60     q[1]=b[1];
61     while (head<tail)
62     {
63         head++;
64         printf("%ld",q[head]);
65         if (tree[q[head]].left!=0)
66         {
67             tail++;
68             q[tail]=tree[q[head]].left;
69         }
70         if (tree[q[head]].right!=0)
71         {
72             tail++;
73             q[tail]=tree[q[head]].right;
74         }
75         if (head!=tail)
76             printf(" "); //output不能多余的空格 
77     }
78     return 0;
79 }

團體程序設計天梯賽 L2-006. 樹的遍歷 L2-011. 玩轉二叉樹