二叉树的构造测试代码:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXSIZE 20
//二叉树结点
typedef struct BINARYNODE{
char data;
struct BINARYNODE* lchild;
struct BINARYNODE* rchild;
}BinaryNode;
BinaryNode *CreateBT1(char *pre, char *in, int n)
{
//k记录根节点的位置
int k;
BinaryNode *s = NULL;
char *p = NULL;
//如果给定的n小于等于0,则返回空
if(n <= 0)
{
return NULL;
}
if(pre == NULL || in == NULL)
{
return NULL;
}
//以先序序列中的根节点来创建根节点
s=(BinaryNode *)malloc(sizeof(BinaryNode));
s->data = *pre;
//在中序(in)中找根节点的位置k
for (p=in; p<in+n; p++)
if (*p==*pre)
break;
k=p-in;
//构建左子树和右子树
s->lchild=CreateBT1(pre+1,in,k);
s->rchild=CreateBT1(pre+k+1,p+1,n-k-1);
return s;
}
BinaryNode *CreateBT2(char *post , char *in, int n)
{
BinaryNode *s = NULL;
char *p = NULL;
int len = strlen(post);
int k;
//ch记录根节点
char ch = *(post + n - 1);
if(n <= 0)
{
return NULL;
}
if(in == NULL || post == NULL)
{
return NULL;
}
//用后序序列中最后一个节点来创建根节点
s = (BinaryNode *)malloc(sizeof(BinaryNode));
s->data = ch;
//在中序(in)中找根节点的位置k
for (p=in; p<in+n; p++)
if (*p == ch)
break;
k=p-in;
//构造左子树和构造右子树
s->lchild = CreateBT2(post,in,k);
s->rchild = CreateBT2(post + k , p+1 , n-k-1);
return s;
}
//先序遍历的递归算法
void PreOrder(BinaryNode *node)
{
if(node != NULL)
{
printf("%c" , node->data);
PreOrder(node->lchild);
PreOrder(node->rchild);
}
}
//中序遍历的递归算法
void InOrder(BinaryNode *node)
{
if(node != NULL)
{
InOrder(node->lchild);
printf("%c" , node->data);
InOrder(node->rchild);
}
}
//后序遍历的递归算法
void PostOrder(BinaryNode *node)
{
if(node != NULL)
{
PostOrder(node->lchild);
PostOrder(node->rchild);
printf("%c" , node->data);
}
}
int main(void)
{
char *pre = "ABDGCEF";
char *in = "DGBAECF";
char *post = "GDBEFCA";
int n = strlen(pre);
BinaryNode *node = NULL;
BinaryNode *node2 = NULL;
printf("-------构造二叉树之前-----\n");
printf("先序:%s\n" , pre);
printf("中序:%s\n" , in);
printf("后序:%s\n\n" , post);
printf("-------以先序和中序构造二叉树-----\n");
//以先序和中序构造二叉树
node = CreateBT1(pre,in,n);
printf("先序:");
PreOrder(node);
printf("\n");
printf("中序:");
InOrder(node);
printf("\n\n");
printf("-------以后序和中序构造二叉树-----\n");
//以后序和中序构造二叉树
node2 = CreateBT2(post,in,n);
printf("后序:");
PostOrder(node2);
printf("\n");
printf("中序:");
InOrder(node2);
printf("\n\n");
return 0;
}
测试结果: