头文件“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;
}

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

1877

被折叠的 条评论
为什么被折叠?



