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 }