#include <stdlib.h>
#include <stdio.h>
int pre[9] = {1, 2, 4, 8, 9, 5, 3, 6, 7};// 先序序列在原节点中的位置
int in[9] = {8, 4, 9, 2, 5, 1, 6, 3, 7};// 中序序列在原节点中的位置
int index[9];// 先序序列在中序序列中的位置
BOOL BuildBiTree(int pl, int pr, int il, int ir)
{
if(pl > pr)// 空树
return true;
int p = index[pl];// 根在中序中的位置
int q = pl + (p - il);// 最后一个灰色节点在先序中的位置
int i = 0;
for(i = pl + 1; i <= q; i++)// 检测灰色节点编号是否越界
{
if(index[i] > p)
return false;
}
if(!BuildBiTree(pl + 1, q, il, index[q]))// 创建左子树
return false;
if(!BuildBiTree(q + 1, pr, p + 1, ir))// 创建右子树
return false;
printf("%d ", pre[pl]);
return true;
}
void Test()
{
int i, j;
const int SIZE = sizeof(index) / sizeof(int);
for(i = 0; i < SIZE; i++)
{
for(j = 0; j < SIZE; j++)
{
if(pre[i] == in[j])
{
index[i] = j;
break;
}
}
}
BuildBiTree(0, SIZE - 1, 0, SIZE - 1);
printf("\n");
}
int main()
{
Test();
return 0;
}