二叉树的中序和层序序列,构造二叉树
从网上未找到易懂的代码,就自己暴力写了一下,如果有前辈有更好的解法,劳驾前辈指导一二。
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<string.h>
#include<vector>
using namespace std;
int n;
vector<int> lev, in;
struct node{
int data;
node *lchild, *rchild;
};
node* deal(int inL, int inR, int head){ //head表示,当前子树的根
if(inL == inR) return NULL; //注意inR是取不到的,开区间,即[inL,inR)
node* root = new node;
root->data = head;
int i, lhead, rhead;
for(i = inL; in[i] != head && i < inR; i++); //在中序序列找到根的位置i
int flag1 = 0, flag2 = 0;
for(int k = 0; k < n; k++){ //从中序序列的左子树中,通过层序遍历找到左子树的根
for(int u = inL; u < i; u++){
if(in[u] == lev[k]){ //找到左子树的根
lhead = lev[k];
flag1 = 1;
break;
}
}
if(flag1 == 1) break;
}
for(int k = 0; k < n; k++){ //从中序序列的右子树中,通过层序遍历找到右子树的根
for(int v = i + 1; v < inR; v++){
if(in[v] == lev[k]){ //找到右子树的根
rhead = lev[k];
flag2 = 1;
break;
}
}
if(flag2 == 1) break;
}
root->lchild = deal(inL, i, lhead);
root->rchild = deal(i + 1, inR, rhead);
return root;
}
void postOrder(node* &root){
if(root == NULL) return;
postOrder(root->lchild);
postOrder(root->rchild);
cout << root->data << " ";
}
int main(){
scanf("%d", &n);
lev.resize(n);
in.resize(n);
fill(lev.begin(), lev.end(), -1);
for(int i = 0; i < n; i++) scanf("%d", &lev[i]);
for(int i = 0; i < n; i++) scanf("%d", &in[i]);
node* root = deal(0, n, lev[0]);
postOrder(root);
return 0;
}
//输入
// 5
//层序:1 2 3 4 5
//中序:4 2 5 1 3
//输出
//后序:4 5 2 3 1
欢迎前辈批评改正!!!