链式二叉树——C语言实现
一、代码注释
1.相关头文件
#include <stdbool.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
2.宏定义内容
这样写是为了方便我们之后更改数据类型时不用在头文件中来回改动
#ifndef TElemType
typedef char TElemType;
/*树结点的数据类型*/
#define TElemType_Flag "char"
/*辅助显示标志*/
#define Nil '#'
/*虚结点标志*/
#endif
辅助宏定义
#define OK 1
// 一般void类型,用不到
#define ERROR 0
// 一般我选择直接终止程序
#define TRUE 1
#define FALSE 0
3.可读性优化及二叉树类型声明
/* Status是函数的类型,其值是函数结果状态代码,OK、ERROR、TRUE、FALSE*/
typedef bool Status;
typedef struct BiTNode
/* 结点结构 */
{
TElemType data;
/* 结点数据 */
struct BiTNode *lchild, *rchild;
/* 左右孩子指针 */
} BiTNode, *BiTree;
/*用于输入字符串/数组构造二叉树,每次创建二叉树时,都要先调用InitBiTree()来重置treeIndex*/
int treeIndex = 0;
4.相关函数
1)构造空二叉树TStatus InitBiTree(BiTree *T)
Status InitBiTree(BiTree *T)
{
*T = NULL;
treeIndex = 0;
printf("树初始化完成\n");
printf("树节点中元素为" TElemType_Flag "类型\n");
return OK;
}
2)创建二叉树T
void CreateBiTree(BiTree *T, char *format, TElemType *str)
通过添加虚结点,将二叉树中的每一实在结点补足成度为2的结点,对补足虚结点后的二叉树按先序遍历的次序输入。
可输入对应的先序遍历指针,即str(format置NULL),或str置NULL,format为对应的键入格式,依次输入先序遍历序列
/*#表示空树或-1表示空树,可自行定义*/
/*输入字符串指针str或str == NULL键入字符串*/
void CreateBiTree(BiTree *T, char *format, TElemType *str)
{
TElemType ch;
if (!str)
scanf(format, &ch);
else
ch = str[treeIndex++];
if (ch == Nil)
*T = NULL;
else
{
*T = (BiTree)malloc(sizeof(BiTNode));
if (!*T)
{
printf("树创建过程中malloc申请空间失败");
exit(-1);
}
(*T)->data = ch; /* 生成根结点 */
CreateBiTree(&(*T)->lchild, format, str); /* 构造左子树 */
CreateBiTree(&(*T)->rchild, format, str); /* 构造右子树 */
}
}
void CreateBiTree_char(BiTree *T, char *preorder, char *inorder)
依次输入二叉树的先序preorder和中序inorder序遍历的结果来生成二叉树
只适用于char类型
void CreateBiTree_char(BiTree *T, char *preorder, char *inorder)
{
if (inorder[0] == '\0')
{
*T = NULL;
return;
}
else
{
*T = (BiTree)malloc(sizeof(BiTNode));
(*T)->data = preorder[treeIndex];
}
int i = 0, length = strlen(inorder);
char *inorder_l, *inorder_r;
while (i < length && preorder[treeIndex] != inorder[i])
i++;
inorder_l = (char *)malloc((i + 1) * sizeof(char));
strncpy(inorder_l, inorder, i);
inorder_l[i] = '\0';
inorder_r = (char *)malloc((length - i) * sizeof(char));
strncpy(inorder_r, &inorder[i + 1], length - i - 1);
inorder_r[length - i - 1] = '\0';
treeIndex++;
CreateBiTree_char(&(*T)->lchild, preorder, inorder_l);
CreateBiTree_char(&(*T)->rchild, preorder, inorder_r);
}
3)销毁二叉树/清空二叉树
/* 初始条件: 二叉树T存在。操作结果: 销毁二叉树T */
void DestroyBiTree(BiTree *T)
{
if (*T)
{
if ((*T)->lchild) /* 有左孩子 */
DestroyBiTree(&(*T)->lchild); /* 销毁左孩子子树 */
if ((*T)->