二叉树链式存储 - C语言 - 【大话数据结构】


前序遍历二叉树:ABDHKECFIGJ
中序遍历二叉树:HKDBEAIFCGJ
后序遍历二叉树:KHDEBIFJGCA

// 二叉树的链式存储
#include "stdlib.h"
#include "stdio.h"
#include "io.h"  
#include "string.h"
#include "math.h"

#define Nil '#'
#define ARRAY_MAXSIZE 30
#define TRUE 1
#define FALSE 0

typedef char TElemType;
//int index = 1;
//typedef char String[24]; /*  0号单元存放串的长度 */
//String str;
// 定义数据结构
typedef struct node
{
	TElemType data; // 存储的数据类型,使用别名TElemType【类型泛化】
	struct node*lchild, *rchild; // 定义左右子树
}BiNode, *BiTree;
int index = 1;
// 定义字符串
typedef struct
{
	char charArray[ARRAY_MAXSIZE];
}String;


///* *****通用函数***** */

void initialString(String *s, const char *chars)
{
	if (strlen(chars) > ARRAY_MAXSIZE)
		printf("字符溢出(字符串长度超过规定的最大长度:%d\n)", ARRAY_MAXSIZE);
	else
	{
		s->charArray[0] = strlen(chars);
		for (int i = 1; i <= s->charArray[0]; i++)
		{
			s->charArray[i] = *(chars +(i-1)); // 指针索引关系
		}
	}
}

void println(TElemType e)
{
	printf(" %c ", e);
}

int isEmpty(BiTree T)
{
	if (T) // T!=NULL, 即T不空
		return FALSE;
	else
		return TRUE;
}

// 每递归一层,深度加1
int depth(BiTree T)
{
	int l, r;
	if (!T) 
	{
		return 0;
	}
	else 
	{
		l = depth(T->lchild);
		r = depth(T->rchild);
	}
	int depth = (l > r ? l + 1 : r + 1);
	return depth;
}

TElemType root(BiTree T)
{
	if (T)
		return ' ';
	else
	{
		return T->data;
	}
}

/* *****通用函数***** */


void initBiTree(BiTree *T)
{
	*T = NULL;
}

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  

// - 创建二叉树
// - 结点分类两种:
//		1 空节点'#'
//		2 字符结点
// - 创建二叉树有两种方式:
//		1 通过有序字符串创建二叉树
//		2 用户输入创建二叉树
void createBiTree(BiTree* T, String str)
{
	TElemType ch;
	ch = str.charArray[index++];

	if (ch == Nil)
		*T = NULL;
	else 
	{
		*T = (BiTree)malloc(sizeof(BiNode));
		if (!*T)
			exit(OVERFLOW);
		(*T)->data = ch; /* 生成根结点 */
		createBiTree(&(*T)->lchild, str); /* 构造左子树 */
		createBiTree(&(*T)->rchild, str); /* 构造右子树 */
	}
}

/* 初始条件: 二叉树T存在 */
/* 操作结果: 前序递归遍历T */
void preOrderTraverse(BiTree T)
{
	if (T == NULL)
		return;
	printf("%c", T->data);/* 显示结点数据,可以更改为其它对结点操作 */
	preOrderTraverse(T->lchild); /* 再先序遍历左子树 */
	preOrderTraverse(T->rchild); /* 最后先序遍历右子树 */
}

/* 初始条件: 二叉树T存在 */
/* 操作结果: 中序递归遍历T */
void inOrderTraverse(BiTree T)
{
	if (T == NULL)
		return;
	inOrderTraverse(T->lchild); /* 中序遍历左子树 */
	printf("%c", T->data);/* 显示结点数据,可以更改为其它对结点操作 */
	inOrderTraverse(T->rchild); /* 最后中序遍历右子树 */
}

/* 初始条件: 二叉树T存在 */
/* 操作结果: 后序递归遍历T */
void postOrderTraverse(BiTree T)
{
	if (T == NULL)
		return;
	postOrderTraverse(T->lchild); /* 先后序遍历左子树  */
	postOrderTraverse(T->rchild); /* 再后序遍历右子树  */
	printf("%c", T->data);/* 显示结点数据,可以更改为其它对结点操作 */
}



int main()
{
	BiTree T;
	TElemType e;
	initBiTree(&T);

	String str;
	initialString(&str, "ABDH#K###E##CFI###G#J##");

	createBiTree(&T, str);

	printf("构造空二叉树后,树空否?%d(1:是 0:否) 树的深度=%d\n", isEmpty(T), depth(T));

	e = root(T);
	printf("二叉树的根为: %c\n", e);


	printf("\n前序遍历:");
	preOrderTraverse(T);
	printf("\n中序遍历:");
	inOrderTraverse(T);
	printf("\n后序遍历:");
	postOrderTraverse(T);

	clearBiTree(&T);
	printf("\n清除二叉树后,树空否?%d(1:是 0:否) 树的深度=%d\n", isEmpty(T), depth(T));
}

posted @ 2020-09-18 11:41  墨狮  阅读(369)  评论(0编辑  收藏  举报