层序建立二叉链表 (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;
}