【练习时间】2021/3/28
【题目名称】已知二叉树的后序遍历和中序遍历,求前序遍历
详细的算法请参照我的另一篇博客
2021/3/6 算法训练 绘制地图(已知数组先序和中序求后序序列)
在这里我们只需要改变cur_pos的初始值和每次运行的操作即可
我们知道后序遍历序列是左子树->右子树->根;所以我们需要先建立右子树而后建立左子树即可。cur_pos初始化为n-1,每次找到后自动减一,如果没找到加一,先建立右子树;
【源代码】
/*
8
4 7 5 2 8 6 3 1
4 2 7 5 1 8 6 3
*/
#include <iostream>
using namespace std;
struct BiNode
{
int data;
BiNode *lchild;
BiNode *rchild;
};
int post[100];
int mid[100];
int cur_pos;
int n;
int FindNode(int val,int start_mid,int end_mid)
{
for(int i=start_mid;i<=end_mid;i++)
{
if(mid[i]==val)return i;
}
return -1;
}
BiNode *CreateTree(int start_mid,int end_mid)
{
if(start_mid>end_mid||cur_pos<0)
{
if(start_mid>end_mid)cur_pos++;
return NULL;
}
BiNode *bt=NULL;
bt=new BiNode;
bt->data=post[cur_pos];
int pos=FindNode(post[cur_pos],start_mid,end_mid);
if(pos!=-1)
{
cur_pos--;
bt->rchild=CreateTree(pos+1,end_mid);
cur_pos--;
bt->lchild=CreateTree(start_mid,pos-1);
}
return bt;
}
void Pre(BiNode *bt)
{
if(bt==NULL)return;
else{
cout<<bt->data<<" ";
Pre(bt->lchild);
Pre(bt->rchild);
}
}
int main()
{
cin>>n;
for(int i=0;i<n;i++)
cin>>post[i];
for(int i=0;i<n;i++)
cin>>mid[i];
cur_pos=n-1;
Pre(CreateTree(0,n-1));
return 0;
}