重建二叉树
时间限制:
1000 ms | 内存限制:
65535 KB
难度:
3
-
描述
- 题目很简单,给你一棵二叉树的后序和中序序列,求出它的前序序列(So easy!)。
#include<stdio.h>
#include<string.h>
struct node{
char data;
node *left,*right;
node(){
left=NULL;
right=NULL;
}
};
void BuildTree(node *&root,char *post,char *in,int len){ //post后序,in中序
if(len==0){
root=NULL;
return;
}
root=new node();
root->data =post[len-1];
char *s=strchr(in,root->data);
int leftlen=strlen(in)-strlen(s);
int rightlen=len-leftlen-1;
BuildTree(root->left ,post,in,leftlen);
BuildTree(root->right ,post+leftlen,s+1,rightlen);
}
void PreOrder(node *root){
if(root==NULL)
return;
printf("%c",root->data);
PreOrder(root->left);
PreOrder(root->right);
}
int main(){
char post[30];
char in[30];
while(~scanf("%s%s",post,in)){
node *root=NULL;
BuildTree(root,post,in,strlen(in));
PreOrder(root);
printf("\n");
}
return 0;
}
这个是不用建立二叉树,用数组存储每次查到的节点,最后输出。
#include<stdio.h>
#include<string.h>
void BuildTree(char *pre,char *post,char *in,int len){
if(len>0){
int n=strchr(in,post[len-1])-in;
BuildTree(pre+1,post,in,n);
BuildTree(pre+n+1,post+n,in+n+1,len-n-1);//这里注意,例如post:C,D,A,B; in:C,B,A,D;
pre[0]=post[len-1]; //第一次找到B,n为1,分左右子树时不再考虑B,in数组从B的前一位考虑,故in+n+1;
} //而post是要从post+n开始考虑的,但不考虑B在数组的个数了,即少了B这个元素,数组长度长度-1.
int main(){
char pre[30],post[30],in[30];
int len;
while(~scanf("%s%s",post,in)){
len=strlen(post);
BuildTree(pre,post,in,len);
pre[len]=0;
puts(pre);
}
return 0;
}