有序二叉树的实现

来源:互联网 发布:淘宝 种子种球许可证 编辑:程序博客网 时间:2024/05/21 22:30

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

0 0
原创粉丝点击