数据结构C语言版 二叉树的三叉链表存储表示
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数据结构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(sizeof(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)