链式二叉树——C语言实现

链式二叉树——C语言实现

  • 一、代码注释
    • 1.相关头文件
    • 2.宏定义内容
    • 3.可读性优化及二叉树类型声明
    • 4.相关函数
      • 1)构造空二叉树T`Status InitBiTree(BiTree *T)`
      • 2)创建二叉树T
        • `void CreateBiTree(BiTree *T, char *format, TElemType *str)`
        • `void CreateBiTree_char(BiTree *T, char *preorder, char *inorder)`
      • 3)销毁二叉树/清空二叉树
      • 4)一些判断操作
        • 树空`Status BiTreeEmpty(BiTree T)`
        • 树相同`Status BiTreeSame(BiTree T1, BiTree T2)`
      • 5)一些求值操作
        • 二叉树T的深度`int BiTreeDepth(BiTree T)`
        • 二叉树每层的宽度`void BiTreeWidth(BiTree T, int *width, int i)`
      • 6)没啥用,提高可读性的操作
        • `TElemType Value(BiTree p)`
        • `void Assign(BiTree p, TElemType value)`
      • 7)遍历打印操作
        • 先序遍历打印`void PreOrderPrint(char *format, BiTree T)`
        • 中序遍历打印`void InOrderPrint(char *format, BiTree T)`
        • 后序遍历打印`void PostOrderPrint(char *format, BiTree T)`
  • 二、完整头文件
  • 三、一些具体使用案例
    • 1.二叉树的创建(链式存储)
      • 1)先序遍历得ABDGCEHF和中序遍历得BGDAEHCF
      • 2)对于该二叉树其补足虚节点
    • 2.应用题
  • 四、总结

一、代码注释

1.相关头文件

#include
#include
#include
#include

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)->

你可能感兴趣的:(数据结构,c语言,数据结构)