#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//定义函数结果状态码
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
//定义数据类型
typedef char ElemType ;
//定义程序返回状态类型
typedef int State;
/* 用于构造二叉树********************************** */
int pos = 0;
#define MAXSIZE 100 /* 存储空间初始分配量 */
typedef char String[MAXSIZE+1]; /* 0号单元存放串的长度 */
String str;
State StrAssign(String T,char *chars)
{
int i;
if(strlen(chars)>MAXSIZE)
return ERROR;
else
{
T[0]=strlen(chars);
for(i=1;i<=T[0];i++)
T[i]=*(chars+i-1);
return OK;
}
}
/* ************************************************ */
// 定义二叉树结点结构体
typedef struct _BiTNode
{
ElemType data; //结点数据
struct _BiTNode *lchild,*rchild; //左右孩子指针
}BiTNode,*BiTree;
/*************************************************
Function: BiTreeInit
Description: 构造空二叉树
Input: BiTNode *T
Output:
Return: 成功返回OK
Others:
*************************************************/
State BiTreeInit(BiTree *T)
{
*T = NULL;
return OK;
}
/*************************************************
Function: BiTreeDestroy
Description: 递归销毁二叉树
Input: BiTNode *T 要求其存在
Output:
Return:
Others:
*************************************************/
void BiTreeDestroy(BiTree *T)
{
if(*T)
{
if((*T)->lchild) /* 有左孩子 */
BiTreeDestroy(&(*T)->lchild); /* 销毁左孩子子树 */
if((*T)->rchild) /* 有右孩子 */
BiTreeDestroy(&(*T)->rchild); /* 销毁右孩子子树 */
free(*T); /* 释放根结点 */
*T=NULL; /* 指针赋NULL */
}
}
/*************************************************
Function: BiTreeCreate
Description: 按前序遍历构造二叉树
Input: BiTNode *T 要求其(指针)存在,不验证
Output:
Return:
Others: #表示空树
*************************************************/
void BiTreeCreate(BiTree *T)
{
ElemType ch;
ch = str[++pos]; //只要str内容正确,会在最后一个字符处递归调用结束
//int index=0; ++index 防止其最后一次调用后越界
if(ch=='#')
*T = NULL;
else
{
*T = (BiTree)malloc(sizeof(BiTNode));
//分配失败
if(!*T)
exit(EXIT_FAILURE);
(*T)->data=ch; /* 生成根结点 */
BiTreeCreate(&(*T)->lchild); /* 构造左子树 */
BiTreeCreate(&(*T)->rchild); /* 构造右子树 */
}
}
/*************************************************
Function: IsEmpty
Description: 判断二叉树是否为空
Input: BiTree T
Output:
Return: 若T为空二叉树,则返回TRUE,否则FALSE
Others:
*************************************************/
State IsEmpty(BiTree T)
{
if(T)
return FALSE;
else
return TRUE;
}
/*************************************************
Function: BiTreeDepth
Description: 求二叉树的深度
Input: BiTree T 不要求其(指针)存在,会验证
Output:
Return: int 若为空树,则返回0,否则返回深度数
Others:
*************************************************/
int BiTreeDepth(BiTree T)
{
int i,j;
//判断是否为空树
if(!T)
return 0;
if(T->lchild)
i=BiTreeDepth(T->lchild);
else
i=0;
if(T->rchild)
j=BiTreeDepth(T->rchild);
else
j=0;
return i>j?i+1:j+1;
}
/*************************************************
Function: BiTreeValue
Description: 返回p所指结点的值
Input: BiTree T 要求其(指针所指结点)存在,不验证
Output:
Return:
Others:
*************************************************/
ElemType BiTreeValue(BiTree p)
{
return p->data;
}
/*************************************************
Function: BiTreeAssign
Description: 给p所指结点赋值为value
Input: BiTree T 要求其(指针所指结点)存在,不验证
ElemType value
Output:
Return:
Others:
*************************************************/
void BiTreeAssign(BiTree p,ElemType value)
{
p->data=value;
}
/*************************************************
Function: PreOrderTraverse
Description: 前序遍历
Input: BiTree T 要求其(指针)存在,验证
Output:
Return:
Others:
*************************************************/
void PreOrderTraverse(BiTree T)
{
if(T==NULL)
return;
printf("%c",T->data);/* 显示结点数据,可以更改为其它对结点操作 */
PreOrderTraverse(T->lchild); /* 再先序遍历左子树 */
PreOrderTraverse(T->rchild); /* 最后先序遍历右子树 */
}
/*************************************************
Function: InOrderTraverse
Description: 中序遍历
Input: BiTree T 要求其(指针)存在,验证
Output:
Return:
Others:
*************************************************/
void InOrderTraverse(BiTree T)
{
if(T==NULL)
return;
InOrderTraverse(T->lchild); /* 中序遍历左子树 */
printf("%c",T->data);/* 显示结点数据,可以更改为其它对结点操作 */
InOrderTraverse(T->rchild); /* 最后中序遍历右子树 */
}
/*************************************************
Function: PostOrderTraverse
Description: 后序遍历
Input: BiTree T 要求其(指针)存在,验证
Output:
Return:
Others:
*************************************************/
void PostOrderTraverse(BiTree T)
{
if(T==NULL)
return;
PostOrderTraverse(T->lchild); /* 先后序遍历左子树 */
PostOrderTraverse(T->rchild); /* 再后序遍历右子树 */
printf("%c",T->data);/* 显示结点数据,可以更改为其它对结点操作 */
}
数据结构C语言实现之二叉树链式结构
最新推荐文章于 2022-12-06 22:06:18 发布