链式存储二叉树
#include <stdio.h>
#include "string.h"
#include "stdlib.h"
#include "math.h"
#include "time.h"
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
/* 存储空间初始分配量 */
#define MAXSIZE 100
/* Status是函数的类型,其值是函数结果状态代码,如OK等 */
typedef int Status;
二叉树构造
#pragma mark--二叉树构造
int indexs = 1;
typedef char String[24];//0号单元存放串的长度
String str;
Status 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;
}
}
二叉树基本操作
#define mark - 二叉树基本操作
typedef char CElemType;
CElemType Nil=' ';//字符型以空格符为空
typedef struct BiTNode//结点结构
{
CElemType data;//结点数据
struct BiTNode *lchild, *rchild;//左右孩子指针
}BiTNode,*BiTree;
//1、打印数据
Status visit(CElemType e){
printf("%c ",e);
return OK;
}
//2、构建空二叉树
Status InitBiTree(BiTree *T){
*T = NULL;
return OK;
}
//3、销毁空二叉树 T
void DestroyBiTree(BiTree *T)
{
if (*T) {
// 有左孩子
if ((*T)->lchild) {
DestroyBiTree(&(*T)->lchild);//销毁左孩子子树
}
// 有右孩子
if ((*T)->rchild) {
DestroyBiTree(&(*T)->rchild);//销毁右孩子子树
}
free(*T);//释放根结点
*T = NULL;//空指针赋值为0
}
}
#define ClearBiTree DestroyBiTree
//4、创建二叉树
//按前序输入二叉树中的结点值(字符),#表示空树
void CreateBiTree(BiTree *T){
CElemType ch;
// 获取字符
ch = str[indexs++];
// 判断当前字符是否为‘#‘
if (ch == '#') {
*T = NULL;
}else{
// 创建新的结点
*T= (BiTree)malloc(sizeof(BiTNode));
// 是否创建成功
if (!*T) {
exit(OVERFLOW);
}
// 生成根结点
(*T)->data = ch;
// 构造左子树
CreateBiTree(&(*T)->lchild);
// 构建右子树
CreateBiTree(&(*T)->rchild);
}
}
//5、二叉树T是否为空
Status BiTreeEmpty(BiTree T){
if (T) {
return FALSE;
}
return TRUE;
}
//6、二叉树T的深度
//初始条件:二叉树T存在
//操作结果:返回T的深度
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;
// 深度从1开始
return i>j?i+1:j+1;
}
//7、二叉树T的根
//初始条件:二叉树T存在
//操作结果:返回T的根
CElemType Root(BiTree T){
if (BiTreeEmpty(T)) {
return Nil;
}
return T->data;
}
//8、返回p指向的结点值
//初始条件:二叉树T存在,p指向T中某个结点
//操作结果:返回p指向结点的值
CElemType Value(BiTree p)
{
return p->data;
}
//9、给p所直结点赋值为value
//初始条件:二叉树T存在,p指向T中某个结点
//操作结果:给p所指结点赋值为value
void Assign(BiTree p,CElemType value){
p->data = value;
}
二叉树遍历
1、前序遍历
#pragma mark - 二叉树遍历
//10、前序递归遍历T
//初始条件:二叉树T存在
//操作结果:前序递归遍历T
void PreOrderTraverse(BiTree T){
if (!T) {
return;
}
printf("%c",T->data);//显示结点数据,可以更改为其他对结点操作
PreOrderTraverse(T->lchild);//再先续遍历左子树
PreOrderTraverse(T->rchild);//最后先续遍历右子树
}
2、中序遍历
//10、中序递归遍历T
void InOrderTraverse(BiTree T){
if (!T) {
return;
}
InOrderTraverse(T->lchild);//中序遍历左子树
printf("%c",T->data);//显示结点数据,可以更改为其它对结点操作
InOrderTraverse(T->rchild);//最后中序遍历右子树
}
3、后续遍历
//11、后续递归遍历T
void PostOrderTraverse(BiTree T){
if (!T) {
return;
}
PostOrderTraverse(T->lchild);//先后续遍历左子树
PostOrderTraverse(T->rchild);//再后续遍历右子树
printf("%c",T->data);//最后显示结点数据,可以更改为其它对结点操作
}
验证
int main(int argc, const char * argv[]) {
// insert code here...
printf("二叉树链式存储结构实现!\n");
int i;
BiTree T;
CElemType e1;
InitBiTree(&T);
StrAssign(str,"ABDH#K###E##CFI###G#J##");
CreateBiTree(&T);
printf("二叉树是否为空%d(1:是 0:否),树的深度=%d\n",BiTreeEmpty(T),BiTreeDepth(T));
e1=Root(T);
printf("二叉树的根为: %c\n",e1);
printf("\n前序遍历二叉树:");
PreOrderTraverse(T);
printf("\n中序遍历二叉树:");
InOrderTraverse(T);
printf("\n后序遍历二叉树:");
PostOrderTraverse(T);
printf("\n");
return 0;
}
结果
二叉树链式存储结构实现!
二叉树是否为空0(1:是 0:否),树的深度=5
二叉树的根为: A
前序遍历二叉树:ABDHKECFIGJ
中序遍历二叉树:HKDBEAIFCGJ
后序遍历二叉树:KHDEBIFJGCA