已知二叉树的前序(或后序)和中序遍历求这颗二叉树
具体实现请看代码:
1 #include<iostream>
2 #include<cstdio>
3 #include<algorithm>
4 #include<vector>
5 #include<map>
6 #include<queue>
7 #include<set>
8 #include<cmath>
9 #include<list>
10 #include<cstring>
11 #include<string>
12 #define ll long long
13 #define ull unsigned long long
14 #define inf 0x3f3f3f3f
15 #define inff 0x7fffffff
16 using namespace std;
17 const int N = 30 + 10;
18 const int M = 200000 + 10;
19 const ll mod = 1e9 + 7;
20
21 //pre数组存放前序遍历序列,in数组存放中序遍历序列,post数组存放后序遍历序列
22 int pre[N], in[N], post[N];
23
24 typedef struct node* BinTree;
25
26 struct node {
27 int date;
28 BinTree left;
29 BinTree right;
30 };
31
32 //已知二叉树的先序遍历和中序遍历求这颗二叉树
33 BinTree Build_pre(int pre[], int in[], int size) {
34
35 if (size <= 0) return NULL;
36 int rem = 0;
37 for (int i = 0; i < size; i++) {
38 if (in[i] == pre[0]) {
39 rem = i;
40 break;
41 }
42 }
43 BinTree tree = (BinTree)malloc(sizeof(struct node));
44 tree->date = pre[0];
45 tree->left = Build_pre(pre + 1, in, rem);
46 tree->right = Build_pre(pre + rem + 1, in + rem + 1, size - rem - 1);
47
48 return tree;
49 }
50
51 //已知二叉树的后续遍历和中序遍历求这颗二叉树
52 BinTree Build_post(int post[], int in[], int size) {
53
54 if (size <= 0) return NULL;
55 int rem = 0;
56 for (int i = 0; i < size; i++) {
57 if (in[i] == post[size - 1]) {
58 rem = i;
59 break;
60 }
61 }
62 BinTree tree = (BinTree)malloc(sizeof(struct node));
63 tree->date = post[size - 1];
64 tree->left = Build_post(post, in, rem);
65 tree->right = Build_post(post + rem, in + rem + 1, size - rem - 1);
66
67 return tree;
68 }
69
70 //以后序遍历这颗二叉树
71 void postorder(BinTree T) {
72
73 if (T == NULL) return;
74 else {
75 postorder(T->left);
76 postorder(T->right);
77 cout << T->date << " ";
78 }
79
80 return;
81 }
82
83 //以前序遍历这颗二叉树
84 void preorder(BinTree T) {
85
86 if (T == NULL) return;
87 else {
88 cout << T->date << " ";
89 preorder(T->left);
90 preorder(T->right);
91 }
92
93 return;
94 }
95
96 //以层序遍历这颗二叉树
97 void sequence(BinTree T) {
98
99 if (T == NULL) return;
100 queue<BinTree>q;
101 q.push(T);
102 while (!q.empty()) {
103 BinTree tmp = q.front();
104 q.pop();
105 if (q.size() == 0 && tmp->left == NULL && tmp->right == NULL) cout << tmp->date;
106 else cout << tmp->date << " ";
107 if (tmp->left != NULL) q.push(tmp->left);
108 if (tmp->right != NULL) q.push(tmp->right);
109 }
110
111 return;
112 }
113
114 int main() {
115
116 int n;
117 cin >> n;
118 for (int i = 0; i < n; i++) {
119 cin >> post[i];
120 }
121 for (int i = 0; i < n; i++) {
122 cin >> in[i];
123 }
124 BinTree T;
125 T = Build_post(post, in, n);
126 //sequence(T);
127 preorder(T);
128 //postorder(T);
129
130 return 0;
131 }
永远热爱,永远向着光。

浙公网安备 33010602011771号