二叉树遍历 ( 中序 + _ _ = 二叉树 ) \Huge{二叉树遍历(中序+\_\_=二叉树)} 二叉树遍历(中序+__=二叉树)
跟据二叉树的性质,给出二叉树的中序遍历以及任意一种遍历顺序,即可构造出一棵唯一的二叉树。
前序遍历:跟左右
中序遍历:左根右
后序遍历:左右跟
层序遍历:按层展开
前序+中序
本题是前序+中序求后序
#include<bits/stdc++.h>
using namespace std;
void build(string s1, string s2) {
if(s1.empty()) return;
char val = s1[0];
int k = s2.find(val);
build(s1.substr(1, k), s2.substr(0, k));
build(s1.substr(k + 1), s2.substr(k + 1));
cout << val;
}
int main() {
string a, b;
while(cin >> a >> b) {
build(a, b);
cout << endl;
}
return 0;
}
后序+中序
本题是后序+中序求层序
#include<bits/stdc++.h>
using namespace std;
int n, a[10010], b[10010], p[10010];
vector<int> v[10010];
//la、ra表示后序遍历中的边界,lb、rb表示中序遍历中的边界,d表示层数
void build(int la, int ra, int lb, int rb, int d) {
if(la > ra) return;
int val = a[ra];
int k = p[val];
v[d].push_back(val);
build(la, la + k - 1 - lb, lb, k - 1, d + 1);//左子树
build(la + k - lb, ra - 1, k + 1, rb, d + 1);//右子树
}
int main() {
cin >> n;
for(int i = 0; i < n; i ++ ) cin >> a[i];//后序
for(int i = 0; i < n; i ++ ) cin >> b[i];//中序
for(int i = 0; i < n; i ++ ) p[b[i]] = i;
build(0, n - 1, 0, n - 1, 0);
for(int i = 0; i < n; i ++ )
for(auto i : v[i])
cout << i << ' ';
return 0;
}
层序+中序
本题是层序+中序求前序
#include<bits/stdc++.h>
using namespace std;
string s1, s2;
void build(int l1 ,int r1, int l2, int r2) {
int i, j;
for(i = l2; i <= r2; i ++ ) {
bool flag = false;
for(j = l1; j <= r1; j ++ ) {
if(s2[i] == s1[j]) {
cout << s2[i];
flag = true;
break;
}
}
if(flag) break;
}
if(j > l1) build(l1, j - 1, l2 + 1, r2);
if(j < r1) build(j + 1, r1, l2 + 1, r2);
}
int main() {
cin >> s1 >> s2;
int n = s1.size();
build(0, n - 1, 0, n - 1);
return 0;
}