层序建立二叉链表 (20 分)
本题要求实现一个函数,给定一棵二叉树的层序序列,创建该树的二叉链表。
函数接口定义:
BinTree CreatBinTree();
函数CreatBinTree从标准输入读入一棵二叉树的层序序列,创建二叉树的二叉链表。函数应返回指向二叉链表根结点的指针。其中,二叉树结点的键值用字符表示,字符之间不含空格。空树用#表示。
其中BinTree结构定义如下:
typedef struct TNode *Position;
typedef Position BinTree;
struct TNode{
ElementType Data;
BinTree Left;
BinTree Right;
};
裁判测试程序样例:
#include <stdio.h>
#include <stdlib.h>
typedef char ElementType;
typedef struct TNode *Position;
typedef Position BinTree;
struct TNode{
ElementType Data;
BinTree Left;
BinTree Right;
};
BinTree CreatBinTree();
void PreorderTraversal( BinTree BT ); /* 实现细节忽略 */
void InorderTraversal( BinTree BT ); /* 实现细节忽略 */
void PostorderTraversal( BinTree BT ); /* 实现细节忽略 */
int main()
{
BinTree BT = CreatBinTree();
printf("Preorder: "); PreorderTraversal(BT); printf("\n");
printf("Inorder: "); InorderTraversal(BT); printf("\n");
printf("Postorder: "); PostorderTraversal(BT);
return 0;
}
/* 你的代码将被嵌在这里 */
输入样例:
abc###d#e##
输出样例:
Preorder: abcde
Inorder: bacde
Postorder: bedca
层序建立二叉链表需要借助队列,但是这是道C语言函数题,就自己用数组模拟个队列用吧(下面代码里的队列模拟是很low的那种,不过不容易出错,这道题数据不是很多,所以也能用。不过我还是感觉循环队列好,没有假溢出)
BinTree CreatBinTree(){
ElementType Data;
BinTree BT,T;
BinTree q[1000005];
int head=0,tail=1;
scanf("%c",&Data);
if(Data!='#'){
BT=(BinTree)malloc(sizeof(struct TNode));
BT->Data=Data;
BT->Left=BT->Right=NULL;
q[head]=BT;
}
else return NULL;
while(head!=tail){
T=q[head];
head++;
scanf("%c",&Data);
if(Data=='#') T->Left=NULL;
else{
T->Left=(BinTree)malloc(sizeof(struct TNode));
T->Left->Data=Data;
T->Left->Left=T->Left->Right=NULL;
q[tail++]=T->Left;
}
scanf("%c",&Data);
if(Data=='#') T->Right=NULL;
else{
T->Right=(BinTree)malloc(sizeof(struct TNode));
T->Right->Data=Data;
T->Right->Left=T->Right->Right=NULL;
q[tail++]=T->Right;
}
}
return BT;
}