团体程序设计天梯赛 L2-006. 树的遍历 L2-011. 玩转二叉树

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 }

 

posted @ 2018-03-15 17:12  congmingyige  阅读(213)  评论(0编辑  收藏  举报