已知先序遍历和中序遍历求后序遍历

已知先序遍历和中序遍历求后序遍历

样例输入
8
1 2 4 5 7 3 6 8
4 2 7 5 1 8 6 3
样例输出
4 7 5 2 8 6 3 1

思路:通过先序遍历和中序遍历可以构造而二叉树,先序遍历的头节点是根节点,再在中序遍历中找到根节点,根节点左边是左子树,右边是右子树,依次循环,直到输入的元素插入完。至此就构成了二叉树。

代码

//
// Created by fundebug on 2021/4/16.
//
#include <iostream>
#include <vector>
#include <queue>
#include <stdio.h>
using namespace std;
int *a;
int *b;
int n;
struct node{
    int data;
    node *left,*right;
};
void postTree(node *root){
    if(root==NULL) return;
    postTree(root->left);
    postTree(root->right);
    cout<<root->data<<" ";
}
int search(int data,int* b,int n){
    for(int i=0;i<n;i++){
        if(b[i]==data)
            return i;
    }
    return -1;
}
node* buildTree(int* a,int *b, int n){
    if(n<=0) return NULL;
    node * root=NULL;
    root=new node;
    int index=search(a[0],b,n);
    root->data=a[0];
    root->left=buildTree(a+1,b,index);
    root->right=buildTree(a+index+1,b+index+1,n-index-1);
    return root;
}
int main(){
    cin>>n;
    a=new int[n];
    b=new int[n];
    for(int i=0;i<n;i++)
        cin>>a[i];
    for(int i=0;i<n;i++)
        cin>>b[i];
    node *root;
    root=buildTree(a,b,n);
    postTree(root);
}
原文地址:https://www.cnblogs.com/mak370/p/14668627.html