【模板一】给出一棵二叉树的中序与后序排列。求出它的先序排列。
#include<iostream>
using namespace std;
#define ll long long
struct node
{
char data;
node*l,*r;//指向左子树与右子树
};
string in,post;
node* create(int postL,int postR,int inL,int inR)//知道后序与中序建树
{
if(postL>postR)return NULL;
node *root=new node;
root->data=post[postR];
int k=inL;
while(k<=inR)
{
if(in[k]==post[postR])break;
k++;
}
int numleft=k-inL;
root->l=create(postL,postL+numleft-1,inL,k-1);
root->r=create(postL+numleft,postR-1,k+1,inR);
return root;
}
void pre(node*root)
{
if(root==NULL)return;
cout<<root->data;
pre(root->l);
pre(root->r);
}
int main()
{
ll n;
cin>>in>>post;
n=in.size();
node *root=create(0,n-1,0,n-1);
pre(root);
}
【模板二】给出一棵二叉树的中序与先序排列。求出它的后序排列。
#include<iostream>
using namespace std;
#define ll long long
struct node
{
char data;
node*l,*r;//指向左子树与右子树
};
string in,pre;
node*create(int inL,int inR,int preL,int preR)//中序与先序排列,求出它的后序排列
{
if(preL>preR)return NULL;
node *root=new node;
root->data=pre[preL];
int k=inL;
while(k<=inR)
{
if(in[k]==pre[preL])break;
k++;
}
int numleft=k-inL;
root->l=create(inL,k-1,preL+1,preL+numleft);
root->r=create(k+1,inR,preL+numleft+1,preR);
return root;
}
void post(node*root)
{
if(root==NULL)return;
post(root->l);
post(root->r);
cout<<root->data;
}
int main()
{
ll n;
cin>>in>>pre;
n=in.size();
node *root=create(0,n-1,0,n-1);
post(root);
}