急求,关于二叉树的程序!

该程序的功能是实现二叉树结点的类型定义和对二叉树的基本操作。该程序包括二叉树结构类型以及每一种操作的具体的函数定义和主函数。
/* 定义DataType为char类型 */
typedef char DataType;

/* 二叉树的结点类型 */
typedef struct BitNode
{DataType data;
struct BitNode *lchild,*rchild;
}BitNode,*BitTree;

/* 初始化二叉树,即把树根指针置空 */
void BinTreeInit(BitTree *BT)

/* 按先序次序建立一个二叉树*/
void BinTreeCreat(BitTree *BT)

/* 检查二叉树是否为空 */
int BinTreeEmpty(BitTree *BT)

/* 按任一种遍历次序(包括按先序、中序、后序、按层次)输出二叉树中的所有结点 */
void BinTraverse(BitTree *BT)

/* 求二叉树的深度 */
int BinTreeDepth(BitTree BT)

/* 求二叉树中所有结点数 */
int BinTreeCount(BitTree BT)

/* 清除二叉树,使之变为空树 */
void BinTreeClear(BitTree *BT)

请写出这个程序的C语言源代码,谢谢!!!

二叉树的一些算法我没做,多了一个层次遍历 你可以娶我空间看看hehe!
/*
包括二叉树的创建和遍历
*/
//头文件
#include "stdio.h"
#include "conio.h"
#include "stdlib.h"
//预定义宏常量
#define OK 1
#define ERROR -1
#define ENDFLAG '#'
typedef char TelemType;
typedef int status;
//二叉树的存储结构
typedef struct BiTNode{
TelemType data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
//全局变量,表示叶子个数
int m=0;
//二叉树的创建
status CreateBiTree(BiTree *T)
{// 先序创建
TelemType ch;
scanf("%c",&ch);
if(ch==ENDFLAG) *T=NULL;
else {
if(!(*T=(BiTNode *)malloc(sizeof(BiTNode))))
{
printf("\nOut of space.");
getch();
exit(0);
}
(*T)->data=ch; //生成根结点
CreateBiTree(&((*T)->lchild));//左子树
CreateBiTree(&((*T)->rchild));//右子树
}
return OK;
}
//先序遍历
status PreOrderTraverse(BiTree T)
{
if(T)
{
printf("%c",T->data);
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
}
return OK;
}/*
//中序
status InOrderTraverse(BiTree T)
{
if(T)
{
InOrderTraverse(T->lchild);
printf("%c",T->data);
InOrderTraverse(T->rchild);
}
return OK;
}
//后序
status PostOrderTraverse(BiTree T)
{
if(T)
{
PostOrderTraverse(T->lchild);
PostOrderTraverse(T->rchild);
printf("%c",T->data);
}
return OK;

}
*/
/*
用队列 层次遍历
*/
//存储定义
typedef char QElemType;
//typedef int status;
typedef struct Queue
{
QElemType data;
struct Queue *next;
}Queue;
//头指针和尾指针
typedef struct
{
Queue *front;
Queue *rear;
}LinkQueue;
//初始化队列
status InitQueue(LinkQueue *q)
{
q->front=q->rear =NULL; //----无头结点
return OK;
}
/*判断队列是否为空*/
status QueueEmpty(LinkQueue *Q)
{
return (Q->front==NULL)&&(Q->rear==NULL);
/*实际上只须判断队头指针是否为空即可*/
}
//入队
void EnQueue(LinkQueue *q,QElemType e)
{
Queue *p;
p=(Queue *)malloc(sizeof(Queue));/*申请新结点*/
p->data=e;
p->next=NULL;
if(QueueEmpty(q))
q->front=q->rear=p;
else {/*x插入非空队列的尾*/
q->rear->next=p; /*p链到原队尾结点后*/
q->rear=p;/*队尾指针指向新的尾*/
}
}
//出队
QElemType DeQueue(LinkQueue *q)
{

Queue *p;
QElemType e;
if(QueueEmpty(q))
{
printf("Queue underflow\n");/*下溢*/
exit(1) ;
}
p=q->front;/*指向对头结点*/
e=p->data;/*保存对头结点的数据*/
q->front=p->next;/*将对头结点从链上摘下*/
if(q->rear==p)/*原队中只有一个结点,删去后队列变空,此时队头指针已为空*/
q->rear=NULL;
free(p);/*释放被删队头结点*/
return e;/*返回原队头数据*/
}
/*层次遍历思想 递归
a.根结点入队列
b.原队左子树的左右孩子(非空)入队列
c.原队右子数的左右孩子(非空)入队列
*/
//层次遍历入队列
status Arrange(BiTree T,LinkQueue *Q)
{
if(T)
{
EnQueue(Q,T->data);
Arrange(T->lchild,Q);
Arrange(T->rchild,Q);
}
return OK;
}
//从队列中输出各元素
status ArrangementTraverse(BiTree T)
{
char e;
LinkQueue Q;
InitQueue(&Q);
if(T)
{
Arrange(T,&Q);//递归调用
while(!QueueEmpty(&Q))
{
e=DeQueue(&Q);
printf("%c",e);

}
}
return OK;
}
//求二叉树的叶结点个数
status NumberLeaves(BiTree T)
{//先序遍历得到叶结点的数目
//m=0;
if(T)
{
if(T->lchild==NULL&&T->rchild==NULL) m++;
NumberLeaves(T->lchild);
NumberLeaves(T->rchild);
}
return OK;
}
//一个比较函数
status Max(int m, int n)
{
if (m > n)
return m;
else
return n;
}
//获取二叉树的高度
status HighBitree(BiTree t)
{
if (t == NULL)
return 0;
else
return 1 + Max(HighBitree(t->lchild), HighBitree(t->rchild));

}
//主函数
void main()
{
BiTree T;
printf("请创建二叉树:\n");
CreateBiTree(&T);
NumberLeaves(T);
printf("叶节点个数为:");
printf("%d",m);
printf("\n二叉树的高度为:");
printf("%d",HighBitree(T));
printf("\n先序遍历:\n");
PreOrderTraverse(T);
/* printf("\n中序遍历:\n");
InOrderTraverse(T);
printf("\n后序遍历:\n");
PostOrderTraverse(T);*/

printf("\n层次遍历\n");
ArrangementTraverse(T);
printf("\n");
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2009-05-23
我不会

参考资料: