给出二叉树的中序遍历序列和后序遍历序列,编程还原该二叉树。
输入:
第1行为二叉树的中序遍历序列
第2行为二叉树的后序遍历序列
输出:
二叉树的按层遍历序列
测试输入 | 期待的输出 | 时间限制 | 内存限制 | 额外进程 | |
---|---|---|---|---|---|
测试用例 1 | 以文本方式显示
| 以文本方式显示
| 1秒 | 64M | 0 |
测试用例 2 | 以文本方式显示
| 以文本方式显示
| 1秒 | 64M | 0 |
测试用例 3 | 以文本方式显示
| 以文本方式显示
| 1秒 | 64M | 0 |
测试用例 6 | 以文本方式显示
| 以文本方式显示
| 1秒 | 64M | 0 |
#include<stdlib.h>
#include<iostream>
#include<queue>
#include<string>
using namespace std;
typedef struct BTN{
char d;
struct BTN *lc;
struct BTN *rc;
}ne,*nep;
void creattree(nep &root,string inorder,string postorder)
{
if(inorder.length()==0) return;
char data=postorder[postorder.length()-1]; //后序序列的尾部即为根结点
int sst=inorder.find(data); //返回中序序列里根结点的下标
string lci,rci,lcp,rcp; //左右结点的中序后序
int llength=sst,rlength=inorder.length()-sst-1; //左右结点长度
lci=inorder.substr(0,sst);
rci=inorder.substr(sst+1);
lcp=postorder.substr(0,sst);
rcp=postorder.substr(llength,rlength);
root=(nep)malloc(sizeof(ne));
root->d=data;
root->lc=NULL;
root->rc=NULL;
creattree(root->lc,lci,lcp);
creattree(root->rc,rci,rcp);
return;
}
void traverse(nep root)
{
queue<nep> l;
nep out=root;
l.push(out);
while(!l.empty())
{
out=l.front();
printf("%c",out->d);
l.pop();
if(out->lc) l.push(out->lc);
if(out->rc) l.push(out->rc);
}
printf("\n");
return;
}
int main(){
nep root;
string inorder,postorder;
getline(cin,inorder);
getline(cin,postorder);
creattree(root,inorder,postorder);
traverse(root);
return 0;
}