6-17 层序建立二叉链表 (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
BinTree CreatBinTree() {
ElementType Data;
BinTree BT,T;
BinTree Q[1000005];//用BinTree的类型的数组模拟队列
int head=0,tail=1;//记录头位置
scanf("%c",&Data);
if(Data!='#') { //单独处理根节点
BT=(BinTree)malloc(sizeof(struct TNode));
BT->Data=Data;
BT->Left=BT->Right=NULL;//先把下边的左右 节点置为NULL
Q[head]=BT; //BT放入队列里
} else return NULL; //根节点是# ,直接over
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;//先把下边的左右 节点置为NULL
Q[tail++]=T->Left;//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;//先把下边的左右 节点置为NULL
Q[tail++]=T->Right;
}
}
return BT;//因为左节点先入队,所以先处理左节点(赋值)
}//tail在前head在后,输出head,head在追赶tail;