【题目描述】
由于先序、中序和后序序列中的任一个都不能唯一确定一棵二叉树,所以对二叉树做如下处理,将二叉树的空结点用·补齐,如图所示。我们把这样处理后的二叉树称为原二叉树的扩展二叉树,扩展二叉树的先序和后序序列能唯一确定其二叉树。
现给出扩展二叉树的先序序列,要求输出其中序和后序序列。
【输入】
扩展二叉树的先序序列。
【输出】
输出其中序和后序序列。
【输入样例】
ABD…EF…G…C…
【输出样例】
DBFEGAC
DFGEBCA
【来源】
No
这题很好,考察了先序,中序和后序,扩展2个点其实就是空,按照先序的定义遍历,就重新构造一个树,然后再按定义遍历输出中序和后续就可以了
注意点
1.构造树的时候,根节点一定要是&
2.遍历字符串的时候可以先定义i=-1,这样在遍历的时候++i就可以是当前的字符,感觉是个小技巧,虽然很简单。
#include<bits/stdc++.h>
using namespace std;
typedef struct node{
char date;
node* lchild;
node* rchild;
};
node *bt;
int i;
string s;
void build(node* &bt){
if(s[++i] != '.'){
bt=new node;
bt->date=s[i];
build(bt->lchild);
build(bt->rchild);
}
else bt =NULL;
}
void inord(node* bt){
if(bt){
inord(bt->lchild);
cout<<bt->date;
inord(bt->rchild);
}
}
void postord(node* bt){
if(bt){
postord(bt->lchild);
postord(bt->rchild);
cout<<bt->date;
}
}
int main()
{
i=-1;
cin>>s;
build(bt);
inord(bt);
cout<<endl;
postord(bt);
cout<<endl;
return 0;
}