求助PAT:ZigZagging on a Tree

USS Enterprise-E 2019-10-12 01:19:35
#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++;
}
}
}
}


...全文
193 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧