前序中序还原树
基本思想:前序序列访问的第一个节点是根节点,中序序列在根节点的两侧分别是左右子树中序遍历的序列
BitNode *CreateBiTree_Post(char *prestr,char *instr,int length)//前序中序还原
{
if(length == 0)
{
return NULL;
}
int i = 0;
char c = prestr[0];//找到根节点
while(instr[i] != c && i<length)
{
i++;
}//此时i是根节点在中序序列中的下标
int leftlength = i;//左子树序列长度
int rightlength = length - i - 1;//右子树序列长度
BitNode*T = (BitNode*)malloc(sizeof(BitNode));
T->data = c;
T->lchild =NULL;
T->rchild = NULL;
T->lchild = CreateBiTree_Post(&prestr[1],&instr[0],leftlength);//递归求左子树的根
/*prestr[1]是左子树前序遍历第一个节点,instr[0]是左子树中序遍历的第一个节点*/
T->rchild = CreateBiTree_Post(&prestr[i+1],&instr[i+1],rightlength);//递归求右子树的根
/*prestr[i+1]是右子树前序遍历第一个节点,instr[i+1]是右子树中序遍历的第一个节点*/
return T;
}
中序后序还原树
基本思想:中序序列在根节点的两侧分别是左右子树中序遍历的序列,后序序列访问的最后一个节点是根节点。
BitNode *CreateBiTree_Pre(char *instr,char *afterstr,int length)//中序后序还原
{
if(length == 0)
{
return NULL;
}
char c = afterstr[length - 1];//后序遍历的最后是根节点
int i = 0;
while((instr[i] != c) && i < length)
{
i++;
}//此时i是根节点在中序序列中的下标
int leftlength = i;//左子树序列长度
int rightlength = length - i - 1;//右子树序列长度
BitNode *T;
T = (BitNode*)malloc(sizeof(BitNode));
T->data = c;
T->lchild = NULL;
T->rchild = NULL;
T->lchild = CreateBiTree_Pre(&instr[0],&afterstr[0],leftlength);//递归求左子树的根
/*instr[0]是左子树中序遍历第一个节点,afterstr[0]是左子树后序遍历的第一个节点*/
T->rchild = CreateBiTree_Pre(&instr[i+1],&afterstr[i],rightlength);//递归求右子树的根
/*instr[i+1]是左子树中序遍历第一个节点,afterstr[i]是右子树后序遍历的第一个节点*/
return T;
}
下面贴完整代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct BitNode
{
char data;
struct BitNode *lchild;
struct BitNode *rchild;
} BitNode;
BitNode *CreateBiTree_Pre(char *instr,char *afterstr,int length);//中序后序转前序
BitNode *CreateBiTree_Post(char *prestr,char *instr,int length);//前序中序转后序
void PreOrderTraverse(BitNode*T);
void PostOrderTraverse(BitNode*T);
int main(void)
{
while(1)
{
printf("请选择:1、前序中序求后序2、中序后序求前序3、退出\n");
int a;
scanf("%d",&a);
if(a == 1)
{
char prestr[100];
char instr[100];
printf("请输入前序输出序列\n");
scanf("%s",prestr);
printf("请输入中序输出序列\n");
scanf("%s",instr);
int length = strlen(prestr);
BitNode* T;
T = CreateBiTree_Post(prestr,instr,length);
printf("后序序列为\n");
PostOrderTraverse(T);
}
else if(a == 2)
{
char instr[100];
char afterstr[100];
printf("请输入中序输出序列\n");
scanf("%s",instr);
printf("请输入后序输出序列\n");
scanf("%s",afterstr);
int length = strlen(instr);
BitNode* T;
T = CreateBiTree_Pre(instr,afterstr,length);
printf("前序序列为\n");
PreOrderTraverse(T);
}
else if(a == 3)
{
return 0;
}
else
{
printf("请重新输入\n");
}
}
return 0;
}
BitNode *CreateBiTree_Pre(char *instr,char *afterstr,int length)//中序后序还原
{
if(length == 0)
{
return NULL;
}
char c = afterstr[length - 1];//后序遍历的最后是根节点
int i = 0;
while((instr[i] != c) && i < length)
{
i++;
}
int leftlength = i;
int rightlength = length - i - 1;
BitNode *T;
T = (BitNode*)malloc(sizeof(BitNode));
T->data = c;
T->lchild = NULL;
T->rchild = NULL;
T->lchild = CreateBiTree_Pre(&instr[0],&afterstr[0],leftlength);
T->rchild = CreateBiTree_Pre(&instr[i+1],&afterstr[i],rightlength);
return T;
}
BitNode *CreateBiTree_Post(char *prestr,char *instr,int length)//前序中序还原
{
if(length == 0)
{
return NULL;
}
int i = 0;
char c = prestr[0];//找到根
while(instr[i] != c && i<length)
{
i++;
}
int leftlength = i;
int rightlength = length - i - 1;
BitNode*T = (BitNode*)malloc(sizeof(BitNode));
T->data = c;
T->lchild =NULL;
T->rchild = NULL;
T->lchild = CreateBiTree_Post(&prestr[1],&instr[0],leftlength);
T->rchild = CreateBiTree_Post(&prestr[i+1],&instr[i+1],rightlength);
return T;
}
void PreOrderTraverse(BitNode*T)
{
if(T)
{
printf("%c",T->data);
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
}
}
void PostOrderTraverse(BitNode*T)
{
if(T)
{
PostOrderTraverse(T->lchild);
PostOrderTraverse(T->rchild);
printf("%c",T->data);
}
}