数据结构C语言版-二叉树的三叉链表存储表示

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

数据结构C语言版-二叉树的三叉链表存储表示

数据结构C语言版二叉树的三叉链表存储表示.txt大悲无泪,大悟无言,大笑无声。我们手里的金钱是保持自由的一种工具。女人在约会前,一定先去美容院;男人约会前,一定先去银行。/*

数据结构C语言版二叉树的三叉链表存储表示

编译环境:Dev-C++ 4.9.9.2

日期:2011年2月13日

*/

#include

#include

typedef char TElemType;

// 二叉树的三叉链表存储表示

typedef struct BiTPNode

{

TElemType data;

struct BiTPNode *parent,*lchild,*rchild; // 双亲、左右孩子指针

}BiTPNode,*BiPTree;

typedef BiPTree QElemType; // 设队列元素为二叉树的指针类型

typedef struct QNode

{

QElemType data; //数据域

struct QNode *next; //指针域

}QNode,*QueuePtr;

typedef struct

{

QueuePtr front,//队头指针,指针域指向队头元素

rear; //队尾指针,指向队尾元素

}LinkQueue;

TElemType Nil=' '; // 字符型以空格符为空

// 构造空二叉树T

int InitBiTree(BiPTree *T)

{

*T=NULL;

return 1;

}

// 销毁二叉树T

void DestroyBiTree(BiPTree *T)

{

if(*T) // 非空树

{

if((*T)->lchild) // 有左孩子

DestroyBiTree(&(*T)->lchild); // 销毁左孩子子树

if((*T)->rchild) // 有右孩子

DestroyBiTree(&(*T)->rchild); // 销毁右孩子子树

free(*T); // 释放根结点

*T=NULL; // 空指针赋0

}

}

#define ClearBiTree DestroyBiTree

// 按先序次序输入二叉树中结点的值(可为字符型或整型,在主程中定义),

// 构造仅缺双亲指针的三叉链表表示的二叉树T。变量Nil表示空(子)树

void Create(BiPTree *T) // CreateBiTree()调用

{

TElemType ch;

scanf("%c",&ch);

if(ch==Nil) // 空

*T=NULL;

else

{

*T=(BiPTree)malloc(sizeof(BiTPNode));

if(!*T)

exit(0);

(*T)->data=ch; // 生成根结点

Create(&(*T)->lchild); // 构造左子树

Create(&(*T)->rchild); // 构造右子树}

}

// 构造一个空队列Q

int InitQueue(LinkQueue *Q)

{

(*Q).front=(*Q).rear=(QueuePtr)malloc(s izeof(QNode)); //动态分配一个空间

if(!(*Q).front)

exit(0);

(*Q).front->next=NULL; //队头指针指向空,无数据域,这样构成了一个空队列return 1;

}

// 若Q为空队列,则返回1,否则返回0

int QueueEmpty(LinkQueue Q)

{

if(Q.front==Q.rear)

return 1;

else

return 0;

// 插入元素e为Q的新的队尾元素

int EnQueue(LinkQueue *Q,QElemType e) {

QueuePtr

p=(QueuePtr)malloc(sizeof(QNode));

if(!p) // 存储分配失败

exit(0);

//生成一个以为e为数据域的队列元素

p->data=e;

p->next=NULL;

//将该新队列元素接在队尾的后面

(*Q).rear->next=p;

(*Q).rear=p;

return 1;

}

// 若队列不空,删除Q的队头元素,用e返回其值,并返回1,否则返回0

int DeQueue(LinkQueue *Q,QElemType *e) {

QueuePtr p;

if((*Q).front==(*Q).rear)

return 0;

p=(*Q).front->next; //队头元素

*e=p->data;

(*Q).front->next=p->next;

if((*Q).rear==p)

(*Q).rear=(*Q).front;

free(p);

return 1;

}

// 按先序次序输入二叉树中结点的值(可为字符型或整型,在主程中定义),

// 构造三叉链表表示的二叉树T

int CreateBiTree(BiPTree *T)

{

LinkQueue q;

QElemType a;

Create(T); // 构造二叉树(缺双亲指针) if(*T) // 非空树

{

相关文档
最新文档