前序中序转后序和层次序列
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/c3efa12229520a267cca963dfc9bbc96.png)
后序中序转前序和层次序列
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/e7cafb19bb1d029c69394193c80f9ff8.png)
具体代码
#include <iostream>
#include <stdio.h>
#include <vector>
#include <queue>
using namespace std;
vector<int> pre, in, post, level[50];
int tree[50][2];
int root;
struct node {
int index, depth;
};
void postOrder(int &index, int inLeft, int inRight, int preLeft) {
if(inLeft > inRight)
return;
int i = inLeft;
while(in[i] != pre[preLeft])
i++;
index = preLeft;
postOrder(tree[index][0], inLeft, i - 1, preLeft + 1);
postOrder(tree[index][1], i + 1, inRight, preLeft + (i - inLeft) + 1);
printf("%d ",in[i]);
}
void preOrder(int &index, int inLeft, int inRight, int postRight) {
if(inLeft > inRight)
return;
int i = inLeft;
while(in[i] != post[postRight])
i++;
index = postRight;
printf("%d ", in[i]);
preOrder(tree[index][0], inLeft, i - 1, postRight - (inRight - i) - 1);
preOrder(tree[index][1], i + 1, inRight, postRight - 1);
}
void levelOrder() {
queue<node> q;
q.push(node{root, 0});
while(!q.empty()) {
node temp = q.front();
q.pop();
if(post.size() != 0)
level[temp.depth].push_back(post[temp.index]);
else
level[temp.depth].push_back(pre[temp.index]);
if (tree[temp.index][0] != 0)
q.push(node{tree[temp.index][0], temp.depth + 1});
if (tree[temp.index][1] != 0)
q.push(node{tree[temp.index][1], temp.depth + 1});
}
}
void getPost() {
int n = 0;
tree[50][0] = {0};
pre.clear();
post.clear();
in.clear();
for(int i = 0; i < 50; i++)
level[i].clear();
printf("请输入树的长度\n");
scanf("%d", &n);
pre.resize(n);
in.resize(n);
printf("请输入前序序列\n");
for(int i = 1; i <= n; i++)
scanf("%d", &pre[i]);
printf("请输入中序序列\n");
for(int i = 1; i <= n; i++)
scanf("%d", &in[i]);
printf("后序序列为:\n");
postOrder(root, 1, n, 1);
}
void getPre() {
int n = 0;
tree[50][0] = {0};
pre.clear();
post.clear();
in.clear();
for(int i = 0; i < 50; i++)
level[i].clear();
printf("请输入树的长度\n");
scanf("%d", &n);
post.resize(n);
in.resize(n);
printf("请输入后序序列\n");
for(int i = 1; i <= n; i++)
scanf("%d", &post[i]);
printf("请输入中序序列\n");
for(int i = 1; i <= n; i++)
scanf("%d", &in[i]);
printf("前序序列为:\n");
preOrder(root, 1, n, n);
}
int main(){
int choose;
printf("(1)前序中序转后序\n");
printf("(2)后序中序转前序\n");
printf("请输入:");
scanf("%d", &choose);
if(choose == 1){
getPost();
}
else {
getPre();
}
levelOrder();
printf("\n");
printf("层次序列为:\n");
printf("第%d层: ",1);
printf("%d\n", level[0][0]);
for (int i = 1; i < 35; i++) {
if(level[i].size() != 0){
printf("第%d层:",i+1);
for (int j = 0; j < level[i].size(); j++)
printf(" %d", level[i][j]);
printf("\n");
}
}
return 0;
}