已知前序和中序求后续遍历

对于一棵二叉树,已知中序和另外一种输出序,可以求出第三种输出序。思想是先根据已知的输出序建好树,然后根据要求输出即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
#include<iostream>
#include<stdio.h>
class Node
{
public:
Node * l;
Node *r;
int val;
Node (int v = 0)
{
l = NULL;
r = NULL;
val = v;
}
};
int find_p (int *mid, int val, int i, int j);
void set_tree (Node * &root, int pos, int *pre, int *mid, int left, int right, bool & good);
void print_tree (Node * root);
int main ()
{
int size;
while (scanf ("%d", &size) != EOF)
{
int *pre = new int[size];
int *mid = new int[size];
for (int i = 0; i < size; i++)
scanf ("%d", &pre[i]);
for (int j = 0; j < size; j++)
scanf ("%d", &mid[j]);
Node *root;
bool good = true;
set_tree (root, 0, pre, mid, 0, size - 1, good);
if(good)
print_tree (root);
else
printf("No");
printf ("n");
delete []pre;
delete []mid;
}
return 0;
}
int find_p (int *mid, int val, int i, int j)
{
for (i; i <= j; i++)
if (mid[i] == val)
return i;
return -1;
}
void set_tree (Node * &root, int pos, int *pre, int *mid, int left, int right, bool & good)
{
if (left > right)
return;
root = new Node (pre[pos]);
int cur = find_p (mid, pre[pos], left, right);
if (cur == -1)
good = false;
if (!good)
return;
set_tree (root->l, pos + 1, pre, mid, left, cur - 1, good);
set_tree (root->r, pos + cur - left + 1, pre, mid, cur + 1, right, good);
}
void print_tree (Node * root)
{
if (root == NULL)
return;
print_tree (root->l);
print_tree (root->r);
printf ("%d ", root->val);
}