算法一
//利用先序序列和后序序列的关系直接转
void PreToPost(ElemType pre[], int l1, int h1, ElemType post[], int l2, int h2){
int half;
if(h1>=l1){
post[h2] = pre[l1];
half = (h1-l1)/2;
PreToPost(pre,l1+1,l1+half,post,l2,l2+half-1);
PreToPost(pre,l1+half+1,h1,post,l2+half,h2-1);
}
}
算法二
//利用栈将满二叉树先序序列创建树 ,再对树进行后序遍历
BiTree PreToPost(ElemType *t, int num){
int h = height(num);
int front = 0;
stack[s] = (BiTree)malloc(sizeof(BiNode));
stack[s]->date = t[front++];
stack[s]->lchild = NULL;
stack[s]->rchild = NULL;
s++;
while(front != num){
if((stack[s-1]->lchild&&stack[s-1]->rchild) || s==h)
s--;
else{
stack[s] = (BiTree)malloc(sizeof(BiNode));
stack[s]->date = t[front++];
stack[s]->lchild = NULL;
stack[s]->rchild = NULL;
if(stack[s-1]->lchild==NULL) stack[s-1]->lchild = stack[s];
else stack[s-1]->rchild = stack[s];
s++;
}
}
return stack[0];
}
测试环境
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define maxsize 100
#define ElemType char
//满二叉树的先序序列
//abdecfg
//abdhiegkcflmgno
typedef struct BiNode{
char date;
struct BiNode *lchild,*rchild;
}BiNode,*BiTree;
BiTree PreToPost(ElemType *t, int num);
int height(int num);
void Traverse(BiNode *p);
int main(){
char c[]="abdhiegkcflmgno";
BiTree t = PreToPost(c,15);
Traverse(t);
return 0;
}
BiTree stack[maxsize];
int s=0;
//利用栈将满二叉树先序序列创建树 ,再对树进行后序遍历
BiTree PreToPost(ElemType *t, int num){
int h = height(num);
int front = 0;
stack[s] = (BiTree)malloc(sizeof(BiNode));
stack[s]->date = t[front++];
stack[s]->lchild = NULL;
stack[s]->rchild = NULL;
s++;
while(front != num){
if((stack[s-1]->lchild&&stack[s-1]->rchild) || s==h)
s--;
else{
stack[s] = (BiTree)malloc(sizeof(BiNode));
stack[s]->date = t[front++];
stack[s]->lchild = NULL;
stack[s]->rchild = NULL;
if(stack[s-1]->lchild==NULL) stack[s-1]->lchild = stack[s];
else stack[s-1]->rchild = stack[s];
s++;
}
}
return stack[0];
}
//求满二叉树的高度
int height(int num){
int i;
num+=1;
for(i=-1;num;i++){
num/=2;
}
return i;
}
//递归方法中序遍历二叉树
void Traverse(BiNode *p){
if(p==NULL){
return;
}
else{
Traverse(p->lchild);
Traverse(p->rchild);
printf("%c",p->date);
}
return;
}