69,382
社区成员
发帖
与我相关
我的任务
分享
#include <stdio.h>
typedef int ElementType;
typedef struct TreeNode *Tree;
struct TreeNode
{
ElementType Element;
Tree Left;
Tree Right;
int Flag;
};
#define MAXN 30
Tree CreateNode(ElementType X);
Tree CreateTree(ElementType *InOrder, ElementType *PostOrder, int N, int cnt);
void LevelOrder(Tree T);
int Num=0;
int main()
{
int N;
ElementType InOrder[MAXN], PostOrder[MAXN];
Tree BinaryTree;
int i;
scanf("%d", &N);
Num = N;
for (i = 0; i < N; i++)
scanf("%d", &InOrder[i]);
for (i = 0; i < N; i++)
scanf("%d", &PostOrder[i]);
BinaryTree = CreateTree(InOrder, PostOrder, N, 1);
LevelOrder(BinaryTree);
system("pause");
return 0;
}
Tree CreateNode(ElementType X)
{
Tree T;
T = (Tree)malloc(sizeof(struct TreeNode));
T->Element = X;
T->Left = NULL;
T->Right = NULL;
return T;
}
Tree CreateTree(ElementType *InOrder, ElementType *PostOrder, int N, int cnt)
{
Tree T;
ElementType InTreeLeft[MAXN], InTreeRight[MAXN], PostTreeLeft[MAXN], PostTreeRight[MAXN];
int i, j, k = 0;
int N_Left, N_Right;
if (N == 0)
return NULL;
else
{
T = CreateNode(PostOrder[N - 1]);
T->Flag = cnt;
if (N != 1)
{
for (i = 0; InOrder[i] != PostOrder[N - 1]; i++)
InTreeLeft[i] = InOrder[i];
for (j = i + 1; j < N; j++)
InTreeRight[k++] = InOrder[j];
N_Left = i;
N_Right = k;
for (i = 0; PostOrder[i] != InTreeRight[0]; i++)
PostTreeLeft[i] = PostOrder[i];
k = 0;
for (j = i; j < N - 1; j++)
PostTreeRight[k++] = PostOrder[j];
cnt++;
T->Left = CreateTree(InTreeLeft, PostTreeLeft, N_Left, cnt);
T->Right = CreateTree(InTreeRight, PostTreeRight, N_Right, cnt);
}
return T;
}
}
void LevelOrder(Tree T)
{
int result[30][16] = { 0 };
Tree TreeNow;
Tree Queue[30];
int Front=0, Rear=0;
int i[30] = { 0 };
int j, k, l = 0;
int cnt = 1;
Queue[Rear++] = T;
//当队头和队尾相等时,表示队列为空
while (Front < Rear)
{
//队头结点出队
TreeNow = Queue[Front++];
result[TreeNow->Flag - 1][i[TreeNow->Flag - 1]] = TreeNow->Element;
i[TreeNow->Flag - 1]++;
//将队头结点的左右孩子依次入队
if (TreeNow->Left != NULL)
{
Queue[Rear++] = TreeNow->Left;
}
if (TreeNow->Right != NULL)
{
Queue[Rear++] = TreeNow->Right;
}
}
for (j = 0; cnt < Num; j++)
{
if (j % 2 != 0)
{
for (k = 0; result[j][k]!=0; k++)
{
printf("%d", result[j][k]);
if (cnt < Num)
printf(" ");
cnt++;
}
}
else
{
while (result[j][l] != 0)
l++;
for (k = l - 1; k >= 0; k--)
{
printf("%d", result[j][k]);
if (cnt < Num)
printf(" ");
cnt++;
}
}
}
}