二叉树的序列转化(前中转后层,后中转前层)

前序中序转后序和层次序列

在这里插入图片描述

后序中序转前序和层次序列

在这里插入图片描述

具体代码

#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;

}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值