有序二叉树的实现

本文详细介绍了有序二叉树的数据结构定义、基本操作实现及测试案例,包括初始化、销毁、插入、删除、查找、遍历、大小、高度等核心功能,通过实例演示了如何使用该数据结构进行数据管理和检索。

头文件“bt.h”

/* 有序二叉树 */
#ifndef _BT_H
#define _BT_H
#include <sys/types.h>
/* 节点 */
typedef struct BsTreeNode {
	int                data;  /* 数据 */
	struct BsTreeNode* left;  /* 左子树 */
	struct BsTreeNode* right; /* 右子树 */
}	BSTREE_NODE;
/* 二叉树 */
typedef struct BsTree {
	BSTREE_NODE* root; /* 树根 */
	size_t       size; /* 大小 */
}	BSTREE;
/* 初始化为空树 */
void bstree_init (BSTREE* bstree);
/* 释放剩余节点并恢复到初始状态 */
void bstree_deinit (BSTREE* bstree);
/* 插入 */
void bstree_insert (BSTREE* bstree, int data);
/* 删除 */
int bstree_erase (BSTREE* bstree, int data);
/* 删除所有匹配数据 */
void bstree_remove (BSTREE* bstree, int data);
/* 清空 */
void bstree_clear (BSTREE* bstree);
/* 更新 */
void bstree_update (BSTREE* bstree, int old,
	int new);
/* 判断是否存在 */
int bstree_exist (BSTREE* bstree, int data);
/* 中序遍历 */
void bstree_travel (BSTREE* bstree);
/* 大小 */
size_t bstree_size (BSTREE* bstree);
/* 高度 */
size_t bstree_height (BSTREE* bstree);
#endif /* _BT_H */

函数具体实现“bt.c”

/* 有序二叉树 */
#include <stdlib.h>
#include <stdio.h>
#include "bt.h"
/* 创建节点 */
static BSTREE_NODE* create_node (int data) {
	BSTREE_NODE* node = malloc (
		sizeof (BSTREE_NODE));
	node->data = data;
	node->left = NULL;
	node->right = NULL;
	return node;
}
/* 销毁节点 */
static void destroy_node (BSTREE_NODE* node) {
	free (node);
}
/* 将参数node的目标节点插入到以参数root的目标节点为
   根的子树中 */
static void insert (BSTREE_NODE* node,
	BSTREE_NODE** root) {
	if (! *root)
		*root = node;
	else if (node)
		if (node->data < (*root)->data)
			insert (node, &(*root)->left);
		else
			insert (node, &(*root)->right);
}
/* 返回以参数root的目标所指向的节点为根的子树中,
   数值与参数data相匹配的节点的父节点中,指向该
   节点的指针型成员变量的地址 */
static BSTREE_NODE** find (int data,
	BSTREE_NODE** root) {
	if (! *root)
		return root;
	if (data < (*root)->data)
		return find (data, &(*root)->left);
	if ((*root)->data < data)
		return find (data, &(*root)->right);
	return root;
}
/* 销毁以参数root的目标节点为根的子树 */
static void clear (BSTREE_NODE** root) {
	if (*root) {
		clear (&(*root)->left);
		clear (&(*root)->right);
		destroy_node (*root);
		*root = NULL;
	}
}
/* 中序遍历以参数root的目标节点为根的子树 */
static void travel (BSTREE_NODE* root) {
	if (root) {
		travel (root->left);
		printf ("%d ", root->data);
		travel (root->right);
	}
}
/* 返回以参数root的目标节点为根的子树的高度 */
static size_t height (BSTREE_NODE* root) {
	if (root) {
		size_t lh = height (root->left);
		size_t rh = height (root->right);
		return (lh > rh ? lh : rh) + 1;
	}
	return 0;
}
/* 初始化为空树 */
void bstree_init (BSTREE* bstree) {
	bstree->root = NULL;
	bstree->size = 0;
}
/* 释放剩余节点并恢复到初始状态 */
void bstree_deinit (BSTREE* bstree) {
	clear (&bstree->root);
	bstree->size = 0;
}
/* 插入 */
void bstree_insert (BSTREE* bstree, int data) {
	insert (create_node (data), &bstree->root);
	++bstree->size;
}
/* 删除 */
int bstree_erase (BSTREE* bstree, int data) {
	BSTREE_NODE** node = find (data, &bstree->root);
	if (*node) {
		/* 将匹配节点的左子树插入其右子树 */
		insert ((*node)->left, &(*node)->right);
		BSTREE_NODE* temp = *node;
		/* 用匹配节点的右子树的根节点取代匹配节点 */
		*node = (*node)->right;
		/* 删除匹配节点 */
		destroy_node (temp);
		--bstree->size;
		return 1;
	}
	return 0;
}
/* 删除所有匹配数据 */
void bstree_remove (BSTREE* bstree, int data) {
	while (bstree_erase (bstree, data));
}
/* 清空 */
void bstree_clear (BSTREE* bstree) {
	bstree_deinit (bstree);
}
/* 更新 */
void bstree_update (BSTREE* bstree, int old,
	int new) {
	while (bstree_erase (bstree, old))
		bstree_insert (bstree, new);
}
/* 判断是否存在 */
int bstree_exist (BSTREE* bstree, int data) {
	return *find (data, &bstree->root) != NULL;
}
/* 中序遍历 */
void bstree_travel (BSTREE* bstree) {
	travel (bstree->root);
	printf ("\n");
}
/* 大小 */
size_t bstree_size (BSTREE* bstree) {
	return bstree->size;
}
/* 高度 */
size_t bstree_height (BSTREE* bstree) {
	return height (bstree->root);
}

测试用例“bt_test.c”

/* 有序二叉树 */
#include <stdio.h>
#include <stdlib.h>
#include "bt.h"
/* 测试用例 */
int main (void) {
	BSTREE bstree;
	bstree_init (&bstree);
	bstree_insert (&bstree, 50);
	bstree_insert (&bstree, 70);
	bstree_insert (&bstree, 20);
	bstree_insert (&bstree, 60);
	bstree_insert (&bstree, 40);
	bstree_insert (&bstree, 30);
	bstree_insert (&bstree, 10);
	bstree_insert (&bstree, 90);
	bstree_insert (&bstree, 80);
	/*
	srand (time (NULL));
	int i;
	for (i = 0; i < 20; ++i)
		bstree_insert (&bstree, rand () % 1000);
	*/
	bstree_travel (&bstree);
	printf ("%u, %u\n", bstree_size (&bstree),
		bstree_height (&bstree));
	bstree_erase (&bstree, 60);
	bstree_travel (&bstree);
	bstree_insert (&bstree, 50);
	bstree_insert (&bstree, 50);
	bstree_travel (&bstree);
	bstree_remove (&bstree, 50);
	bstree_travel (&bstree);
	bstree_insert (&bstree, 40);
	bstree_insert (&bstree, 40);
	bstree_travel (&bstree);
	bstree_update (&bstree, 40, 85);
	bstree_travel (&bstree);
	printf ("%d, %d\n", bstree_exist (&bstree, 40),
		bstree_exist (&bstree, 85));
	bstree_deinit (&bstree);
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值