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

本文详细介绍了如何使用C语言实现链式二叉树,包括构造空树、创建树、销毁树、判断操作、求值操作、遍历打印等功能。同时,提供了完整的头文件和具体使用案例,如通过先序和中序遍历序列创建二叉树,并探讨了二叉树的最大宽度等应用问题。
摘要由CSDN通过智能技术生成

一、代码注释

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)->
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值