1. 程式人生 > >資料結構與演算法·實驗九

資料結構與演算法·實驗九

求二叉樹的層序遍歷問題

要求:(1)編寫一個建立二叉樹的函式。

(2)編寫按層次(同一層自左至右)輸出二叉樹中所有的結點的函式。

           (3)編寫一個測試主函式。

#include<stdlib.h>
#include<stdio.h>
typedef char ElemType;
#include "BiTree.h"
typedef BiTreeNode *DataType;
#include "LinQueue.h"

void visit(DataType item)
{
	printf("%c",item);
}

//void LayerOrder(BiTreeNode *T)
//{
//}

void main(void)
{
	BiTreeNode *root,*p,*pp;
	int count;
	Initiate(&root);
	p=InsertleftNode(root,'A');
	p=InsertleftNode(p,'B');
	p=InsertleftNode(p,'D');
	p=InsertRightNode(p,'G');
	p=InsertRightNode(root->leftChild,'C');
	pp=p;
	InsertleftNode(p,'E');
	InsertRightNode(pp,'F');
	//LayerOrder(root->leftChild);
	Destroy(&root);
}


typedef struct Node
{
	ElemType data;                /*資料域*/
	struct Node *leftChild;       /*左子樹指標*/
	struct Node *rightChild;      /*右子樹指標*/
}BiTreeNode;                      /*結點的結構體定義*/

void Initiate(BiTreeNode **root)  /*初始化建立二叉樹的頭結點*/
{
	*root=(BiTreeNode *)malloc(sizeof(BiTreeNode));
	(*root)->leftChild=NULL;
	(*root)->rightChild=NULL;
}

void Destroy(BiTreeNode **root)
{
	if((*root)!=NULL&&(*root)->leftChild!=NULL)
		Destroy(&(*root)->leftChild);
	if((*root)!=NULL&&(*root)->rightChild!=NULL)
		Destroy(&(*root)->rightChild);
	free(*root);
}

/*若當前結點curr非空,在curr的左子樹插入元素值為x的新結點*/
/*原curr所指結點的左子樹成為新插入結點的左子樹*/
/*若插入成功返回新插入結點的指標,否則返回空指標*/

BiTreeNode *InsertleftNode(BiTreeNode *curr,ElemType x)
{
	BiTreeNode *s,*t;
	if(curr==NULL)
		return NULL;
	t=curr->leftChild;
	s=(BiTreeNode *)malloc(sizeof(BiTreeNode));
	s->data=x;
	s->leftChild=t;
	s->rightChild=NULL;
	curr->leftChild=s;
	return curr->leftChild;
}

BiTreeNode *InsertRightNode(BiTreeNode *curr,ElemType x)
{                                          
	BiTreeNode *s,*t;
	if(curr==NULL)
		return NULL;
	t=curr->rightChild;       /*儲存原curr所指結點的右子樹指標*/
	s=(BiTreeNode *)malloc(sizeof(BiTreeNode));
	s->data=x;
	s->rightChild=t;          /*新插入結點的右子樹為原curr的右子樹*/
	s->leftChild=NULL;
	curr->rightChild=s;       /*新結點成為curr的右子樹*/
	return curr->rightChild;  /*返回新插入結點的指標*/
}

BiTreeNode *DeleteLeftTree(BiTreeNode *curr)  /*若curr非空,刪除curr所指結點的左子樹*/
{
	if(curr==NULL||curr->leftChild==NULL)
		return NULL;
	Destroy(&curr->leftChild);
	curr->leftChild=NULL;
	return curr;                              /*若刪除成功返回刪除結點的雙親結點指標,否則返回空指標*/
}

BiTreeNode *DeleteRightTree(BiTreeNode *curr)
{
	if(curr==NULL||curr->rightChild==NULL)
		return NULL;
	Destroy(&curr->rightChild);
	curr->rightChild=NULL;
	return curr;
}


typedef struct qnode
{
	DataType data;
	struct qnode *next;
}LQNode;

typedef struct
{
	LQNode *front;  /*隊頭指標*/
	LQNode *rear;   /*隊尾指標*/
}LQueue;

void QueueInitiate(LQueue *Q)  /*初始化鏈式佇列Q*/
{
	Q->rear=NULL;  /*定義初始隊尾指標下標值*/
	Q->front=NULL;  /*定義初始隊頭指標下標值*/
}

int QueueNotEmpty(LQueue Q)  /*判鏈式佇列Q非空否,非空則返回1,否則返回0*/
{
	if(Q.front==NULL) return 0;
	else return 1;
}

int QueueAppend(LQueue *Q,DataType x)  /*把資料元素值x插入鏈式佇列Q的隊尾,入佇列成功則返回1,否則返回0 */
{
	LQNode *p;
	if((p=(LQNode *)malloc(sizeof(LQNode)))==NULL)
	{
		printf("記憶體空間不足!");
		return 0;
	}
	p->data=x;
	p->next=NULL;
	if(Q->rear!=NULL)
		Q->rear->next=p;
	Q->rear=p;
	if(Q->front==NULL)
		Q->front=p;
	return 1;
}

int QueueDelete(LQueue *Q,DataType *d)  /*刪除鏈式佇列Q的隊頭資料元素值到d ,出佇列成功則返回1,否則返回0*/
{
	LQNode *p;
	if(Q->front==NULL)
	{
		printf("佇列已空無資料元素出佇列!\n");
		return 0;
	}
	else
	{
		*d=Q->front->data;
		p=Q->front;
		Q->front=Q->front->next;
		if(Q->front==NULL)
			Q->rear=NULL;
		free(p);
		return 1;
	}
}

int QueueGet(LQueue Q,DataType *d)  /*取鏈式佇列Q的當前隊頭資料元素值到d ,成功則返回1,否則返回0*/
{
	if(Q.front==NULL)
	{
		printf("佇列已空無資料元素出佇列!\n");
		return 0;
	}
	else
	{
		*d=Q.front->data;
		return 1;
	}
}

void Destroy1(LQueue Q)
{
	LQNode *p,*p1;
	p=Q.front;
	while(p!=NULL)
	{
		p1=p;
		p=p->next;
		free(p1);
	}
}