有序二叉树的实现
来源:互联网 发布:淘宝 种子种球许可证 编辑:程序博客网 时间: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
- 有序二叉树的实现
- 有序二叉树的实现
- 有序二叉树的算法
- 有序二叉树的操作
- 有序二叉树的创建与遍历
- 平衡二叉有序树
- C/C++基本数据结构:有序二叉树的基本概念和实现
- C语言数据结构——数据结构有序二叉树的函数实现
- 数据结构实现之有序符号表BST二叉查找树
- 有序符号表(二叉树实现,JAVA,算法(四))
- 二叉树定义--有序树
- 广度遍历有序二叉树
- 二叉树转为有序列表
- 二叉查找树(二叉排序树、有序二叉树)算法分析及实现
- 二叉树、树和有序树的区别
- 二叉查找树转变成有序的双向链表
- 把一个有序的数组转为二叉树存储
- 将有序单链表转换为平衡的二叉搜索树
- ios controller之间传递参数
- UML图和C#
- 又兜回到Hibernate,HHH000387: ResultSet's statement was not registered
- jquery文字轮播 滚动
- log4j配置祥解--(2)参数说明以及配置例子
- 有序二叉树的实现
- LINUX修改IP地址
- 贫农的大数据之三(Storm集群部署)
- 重排序意味着什么?
- Makefile静态模式
- 实习工作经验
- 修改hadoop的core-site.xml的配置文件不需重启也生效了
- 新的起点、新的开始
- C/C++程序内存布局