链式二叉树——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)-&g
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
链式二叉树的基本操作包括创建、遍历、插入、删除等。 下面是C语言实现链式二叉树的基本操作示例代码: ```c #include <stdio.h> #include <stdlib.h> // 定义二叉树结构体 typedef struct TreeNode{ int data; struct TreeNode *left; struct TreeNode *right; }TreeNode, *Tree; // 创建二叉树 void createTree(Tree *t){ int data; scanf("%d", &data); if(data == -1){ // 输入-1表示该节点为空 *t = NULL; }else{ *t = (Tree)malloc(sizeof(TreeNode)); (*t)->data = data; createTree(&((*t)->left)); // 递归创建左子树 createTree(&((*t)->right)); // 递归创建右子树 } } // 先序遍历 void preOrder(Tree t){ if(t != NULL){ printf("%d ", t->data); preOrder(t->left); preOrder(t->right); } } // 中序遍历 void inOrder(Tree t){ if(t != NULL){ inOrder(t->left); printf("%d ", t->data); inOrder(t->right); } } // 后序遍历 void postOrder(Tree t){ if(t != NULL){ postOrder(t->left); postOrder(t->right); printf("%d ", t->data); } } // 插入节点 void insert(Tree t, int data){ if(t == NULL){ t = (Tree)malloc(sizeof(TreeNode)); t->data = data; t->left = NULL; t->right = NULL; }else{ if(data < t->data){ insert(t->left, data); }else{ insert(t->right, data); } } } // 查找节点 Tree search(Tree t, int data){ if(t == NULL){ return NULL; }else{ if(data == t->data){ return t; }else if(data < t->data){ return search(t->left, data); }else{ return search(t->right, data); } } } // 删除节点 Tree delete(Tree t, int data){ Tree p = t, q = NULL; while(p != NULL && p->data != data){ q = p; if(data < p->data){ p = p->left; }else{ p = p->right; } } if(p == NULL){ // 没有找到要删除的节点 return t; } if(p->left == NULL){ // 要删除的节点没有左子树 if(q == NULL){ // 要删除的节点是根节点 t = p->right; }else if(p == q->left){ // 要删除的节点是其父节点的左子节点 q->left = p->right; }else{ // 要删除的节点是其父节点的右子节点 q->right = p->right; } free(p); }else if(p->right == NULL){ // 要删除的节点没有右子树 if(q == NULL){ // 要删除的节点是根节点 t = p->left; }else if(p == q->left){ // 要删除的节点是其父节点的左子节点 q->left = p->left; }else{ // 要删除的节点是其父节点的右子节点 q->right = p->left; } free(p); }else{ // 要删除的节点有左右子树 Tree s = p->left, r = p; while(s->right != NULL){ r = s; s = s->right; } p->data = s->data; if(r == p){ // 要删除的节点的左子树没有右子树 r->left = s->left; }else{ // 要删除的节点的左子树有右子树 r->right = s->left; } free(s); } return t; } int main(){ Tree t = NULL; createTree(&t); // 创建二叉树 printf("先序遍历:"); preOrder(t); // 先序遍历 printf("\n中序遍历:"); inOrder(t); // 中序遍历 printf("\n后序遍历:"); postOrder(t); // 后序遍历 printf("\n"); int data; printf("请输入要插入的节点值:"); scanf("%d", &data); insert(t, data); // 插入节点 printf("中序遍历:"); inOrder(t); // 中序遍历 printf("\n请输入要查找的节点值:"); scanf("%d", &data); Tree node = search(t, data); // 查找节点 if(node != NULL){ printf("找到了节点:%d\n", node->data); }else{ printf("没有找到节点:%d\n", data); } printf("请输入要删除的节点值:"); scanf("%d", &data); t = delete(t, data); // 删除节点 printf("中序遍历:"); inOrder(t); // 中序遍历 return 0; } ``` 以上代码实现创建二叉树、先序遍历、中序遍历、后序遍历、插入节点、查找节点、删除节点等操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值