二叉查找树实现实例(C语言)
/* search_tree.h */ #ifndef _SEARCH_TREE_H
#define _SEARCH_TREE_H struct tree_node;
typedef struct tree_node *position;
typedef struct tree_node *search_tree; search_tree make_empty(search_tree t);
position find(int x, search_tree t);
position find_min(search_tree t);
position find_max(search_tree t);
search_tree insert_tree(int x, search_tree t);
search_tree delete_tree(int x, search_tree t);
int retrieve(position p);
void preorder_print_search_tree(search_tree t);
void inorder_print_search_tree(search_tree t);
void postorder_print_search_tree(search_tree t);
#endif
/* search_tree.c */ #include "search_tree.h"
#include <stdio.h>
#include <stdlib.h> struct tree_node
{
int element;
search_tree left;
search_tree right;
}; search_tree
make_empty(search_tree t)
{
if(t != NULL)
{
make_empty(t->left);
make_empty(t->right);
free(t);
}
return NULL;
} position find(int x, search_tree t)
{
if(t == NULL)
{
return NULL;
}
if(x < t->element)
return find(x, t->left);
else if(x > t->element)
return find(x, t->right);
else
return t;
} position
find_min(search_tree t)
{
if(t == NULL)
return NULL;
else if(t->left == NULL)
return t;
else
return find_min(t->left);
} position
find_max(search_tree t)
{
if(t == NULL)
return NULL;
else if(t->right == NULL)
return t;
else
return find_max(t->right);
} search_tree
insert_tree(int x, search_tree t)
{
if(t == NULL)
{
/* create and return a one-node tree */
t = malloc(sizeof(struct tree_node));
if(t == NULL)
{
printf("out of space!!!\n");
exit(1);
}
else
{
t->element = x;
t->left = NULL;
t->right = NULL;
}
}
else if(x < t->element)
t->left = insert_tree(x, t->left);
else if(x > t->element)
t->right = insert_tree(x, t->right);;
/* else x is in the tree already; we'll do nothing */ return t; /* do not forget this line */
} search_tree
delete_tree(int x, search_tree t)
{
position tmpcell; if(t == NULL)
{
printf("element not found!\n");
exit(1);
}
else if(x < t->element) /* go left */
t->left = delete_tree(x, t->left);
else if(x > t->element) /* go right */
t->right = delete_tree(x, t->right);
else if(t->left && t->right) /* two children */
{
/* replace with smallest in right subtree */
tmpcell = find_min(t->right);
t->element = tmpcell->element;
t->right = delete_tree(t->element, t->right);
}
else /* one or zero children */
{
tmpcell = t;
if(t->left == NULL) /* also handles 0 children */
t = t->right;
else if(t->right == NULL)
t = t->left;
free(tmpcell);
}
return t;
} int
retrieve(position p)
{
return p->element;
} void
preorder_print_search_tree(search_tree t)
{
if(t != NULL) {
printf("%d ", t->element);
preorder_print_search_tree(t->left);
preorder_print_search_tree(t->right);
}
}
void
inorder_print_search_tree(search_tree t)
{
if(t != NULL)
{
inorder_print_search_tree(t->left);
printf("%d ", t->element);
inorder_print_search_tree(t->right);
}
}
void
postorder_print_search_tree(search_tree t)
{
if(t != NULL)
{
postorder_print_search_tree(t->left);
postorder_print_search_tree(t->right);
printf("%d ", t->element);
}
}
/* search_tree_test.c */ #include "search_tree.h"
#include <stdio.h> int
main(void)
{
search_tree t = NULL;
position pmin, pmax;
int min, max; t = make_empty(t);
printf("insert 10 to search_tree\n");
t = insert_tree(10, t);
printf("insert 4 to search_tree\n");
t = insert_tree(4, t);
printf("insert 6 to search_tree\n");
t = insert_tree(6, t);
printf("insert 18 to search_tree\n");
t = insert_tree(18, t);
printf("insert 12 to search_tree\n");
t = insert_tree(12, t); pmin = find_min(t);
pmax = find_max(t); min = retrieve(pmin);
max = retrieve(pmax); printf("\npreorder traversal the search tree is :");
preorder_print_search_tree(t);
printf("\ninorder traversal the search tree is :");
inorder_print_search_tree(t);
printf("\npostorder traversal the search tree is :");
postorder_print_search_tree(t);
printf("\nmin = %d\nmax = %d\n", min, max); }
测试结果:

二叉查找树实现实例(C语言)的更多相关文章
- Redis:安装、配置、操作和简单代码实例(C语言Client端)
Redis:安装.配置.操作和简单代码实例(C语言Client端) - hj19870806的专栏 - 博客频道 - CSDN.NET Redis:安装.配置.操作和简单代码实例(C语言Client端 ...
- 实例15_C语言绘制万年历
实例说明:
- 简单的数据库连接池实例(java语言)
1.概述 频繁的创建和销毁数据库连接消耗非常多的系统资源,创建一个池子, 管理一定数量的连接,用的时候去池中取,用完了放回池中,这时比较通用的做法. 2.关键字 LinkedList synchro ...
- socket实例C语言:一个简单的聊天程序
我们老师让写一个简单的聊天软件,并且实现不同机子之间的通信,我用的是SOCKET编程.不废话多说了,先附上代码: 服务器端server.c #include <stdio.h> #incl ...
- C 语言实例
C 语言实例 C 语言实例 - 输出 "Hello, World!" C 语言实例 - 输出整数 C 语言实例 - 两个数字相加 C 语言实例 - 两个浮点数相乘 C 语言实例 - ...
- C 语言实例 - 判断字母
C 语言实例 - 判断字母 C 语言实例 C 语言实例 用户输入一个字符,判断该字符是否为一个字母. 实例 #include <stdio.h> int main() { char c; ...
- C 语言实例 - 判断奇数/偶数
C 语言实例 - 判断奇数/偶数 C 语言实例 C 语言实例 以下实例判断用户输入的整数是奇数还是偶数. 实例 #include <stdio.h> int main() { int nu ...
- C 语言实例 - 判断元音/辅音
C 语言实例 - 判断元音/辅音 C 语言实例 C 语言实例 判断输入的字母是元音,还是辅音. 英语有26个字母,元音只包括 a.e.i.o.u 这五个字母,其余的都为辅音.y是半元音.半辅音字母,但 ...
- C 语言实例 - 将字符串写入文件
C 语言实例 - 将字符串写入文件 C 语言实例 C 语言实例 将字符串写入文件. 实例 #include <stdio.h> #include <stdlib.h> /* e ...
随机推荐
- PHP运行时强制显示出错信息
调试很重要 error_reporting(E_ALL); ini_set('display_errors', '1'); 将出错信息输出到一个文本文件 ini_set('error_log', di ...
- Windows下Python版本的切换
通常在Windows系统下我们可能安装了多个Python版本,那么该如何进行版本的切换呢?下面就Python2.7与Python3.0版本进行简单说明. 1.首先需要在Windows上安装Python ...
- ThinkPHP 数据库操作之数据表模型和基础模型 ( Model )
一.定义数据表模型 1.模型映射 要测试数据库是否正常连接,最直接的办法就是在当前控制器中实例化数据表,然后使用 dump 函数输出,查看数据库的链接状态.代码: public function te ...
- CSS Flex布局属性整理
Flex布局 display: flex; 将对象作为弹性伸缩盒展示,用于块级元素 display: inline-flex; 将对象作为弹性伸缩盒展示,用于行内元素 注意兼容问题: webkit内核 ...
- 解决win8内置管理员无法激活此应用
解决win8内置管理员无法激活此应用 方法/步骤 在运行中输入:“gpedit.msc”,就会启动组策略编辑器. 依次展开“计算机配置”里面的 “Windows设置” “安全设置” “本地策略 ...
- arcgis新版本增加的功能
1.导出拓扑错误 2.应用图层的符号设置 3.创建 SQLite 数据库 4.最小包围体 5.图形缓冲 6.按属性分割
- [翻译] AFNetworking 2.0
大名鼎鼎的开源网络库AFNetworking 2.0,目前只是翻译了Github上的链接文章,使用教程请点击 http://www.cnblogs.com/YouXianMing/p/3651462. ...
- 【BZOJ】【2127】happiness
网络流/最小割 Orz Hzwer. 这题他题解说的比较简略……我手画了个图才明白过来…… 嗯对于每个人选文or理的单独收益大家应该很好理解……连S->i 权值为选文的喜悦值,i->T权值 ...
- Redis:ERR operation not permitted
Redis服务开启之后: D:\Redis\redis>redis-server.exe redis.conf 那么另外开一个命令窗口 D:\Redis\redis>redis-cli.e ...
- iOS: 音效和音乐的播放,封装的工具类
在iOS中音频播放从形式上可以分为音效播放和音乐播放.前者主要指的是一些短音频播放,通常作为点缀音频,对于这类音频不需要进行进度.循环等控制.后者指的是一些较长的音频,通常是主音频,对于这些音频的播放 ...