【数据来源】T143
【代码】
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <ctype.h>
#include <string.h>
#define maxSize 100
typedef char ElementType;
typedef struct BTNode
{
ElementType data;
struct BTNode* lchild, *rchild;
}BTNode;
//由层次遍历和中序遍历序列生成二叉树的办法(自己的办法):二叉树的根节点在层次遍历序列中要先于
//其子树首先被访问,所以层次遍历序列中第一个与中序序列中匹配的字符为中序序列的根结点
BTNode* CreateBTree(ElementType level[], ElementType in[], int l1, int r1, int l2, int r2)
{
if (l2 > r2)
{
return NULL;
}
else
{
BTNode* bt = (BTNode*)malloc(sizeof(BTNode));
int i, j;//分别指向level和in中数组的元素
int flag = 0;
//寻找根结点,若level中第一个与in中元素匹配的即为根结点
for (i = l1; i <= r1; ++i)
{
for (j = l2; j <= r2; ++j)
{
if (level[i] == in[j])
{
flag = 1;
break;
}
}
if (flag == 1)
break;
}
bt->data = level[i];//曾经写错过,写成了level[j],j指向的是in中的元素,应改为in[j]
bt->lchild = CreateBTree(level, in, l1 + 1, r1, l2, j - 1);
bt->rchild = CreateBTree(level, in, l1 + 1, r1, j + 1, r2);
return bt;
}
}
void InOrder(BTNode* bt)
{
if (bt != NULL)
{
InOrder(bt->lchild);
printf("%c", bt->data);
InOrder(bt->rchild);
}
}
void PreOrder(BTNode* bt)
{
if (bt != NULL)
{
printf("%c", bt->data);
PreOrder(bt->lchild);
PreOrder(bt->rchild);
}
}
int main()
{
ElementType level[maxSize] = "ABCDEFGHI";
ElementType in[maxSize] = "DBEAHFICG";
int len = strlen(level);
BTNode* root = NULL;
root = CreateBTree(level, in, 0, len - 1, 0, len - 1);
//分别用中序和先序来验证创建的二叉树是否正确
InOrder(root);
printf("\n");
PreOrder(root);
return 0;
}
【结果】
