您的位置:首页 > 理论基础 > 数据结构算法

数据结构C语言实现之二叉树链式结构

2013-06-13 19:40 323 查看
#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);/* 显示结点数据,可以更改为其它对结点操作 */
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: