数据结构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);/* 显示结点数据,可以更改为其它对结点操作 */ }
相关文章推荐
- 【数据结构】二叉树链式结构实现_BiTreeLink
- 二叉树的链式结构实现
- 数据结构——二叉树的链式实现(C语言)
- 二叉树链式结构实现
- 二叉树的链式存储结构 前序 后序 中序 层序遍历操作实现 判断是否完全二叉树
- 二叉树的简介及链式结构实现
- 大话数据结构 code 第五章 02二叉树链式结构实现_BiTreeLink
- 二叉树顺序结构实现/链式结构实现
- 二叉树的链式结构递归遍历实现
- 大话数据结构 code 第6章 02二叉树链式结构实现_BiTreeLink
- 链式结构实现二叉树
- 二叉树链式结构C代码实现
- 二叉树的链式存储结构 C++代码实现
- 数据结构之C/C++实现二叉树的链式存储
- 数据结构之---二叉树C实现
- 二叉树的结构与实现
- (学习java)二叉树的链式实现以及三种遍历方式
- 二叉树(二叉链式存储)8种基本操作的实现
- 数据结构与算法(C#实现)系列---二叉树
- 数据结构基础(14) --链式队列的设计与实现