二叉查找树实现实例(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 ...
随机推荐
- Python threads synchronization: Locks, RLocks, Semaphores, Conditions, Events and Queues(Forwarding)
This article describes the Python threading synchronization mechanisms in details. We are going to s ...
- MVC批量更新,使用jQuery Template
在"MVC批量更新,可验证并解决集合元素不连续控制器接收不完全的问题"中,当点击"添加"按钮的时候,通过部分视图,在界面上添加新行.本篇体验使用jQuery T ...
- 爱普生Me330 打印机改装连供系统计划
Me330想改装连供得大家可以看一下,本文是我的亲生经历,现分享给大家,希望能给你们提供帮助,如果有不懂的地方可以联系我Email: 事先说明,我不买连供,也不卖这款机子,购买的话,请不要打扰我!& ...
- putty的保存功能如何使用
Putty的设置保存功能隐藏的实在太好了,原来在Connection菜单中修改设置后,并不能在该界面保存. 保存步骤: 1.需要点击Session菜单,选中下面的Default Setting. 2. ...
- java获取路径(转)
1.利用System.getProperty()函数获取当前路径:System.out.println(System.getProperty("user.dir"));//user ...
- plsql调用无参/有参存储过程
--有参调用方式:declare STERMINAL ); SPROCESS NUMBER; begin sj_transfera_digi_getmapping(,,'DYH010006783031 ...
- 【BZOJ】【3611】【HEOI2014】大工程
虚树+树形DP 本题100W的点数……不用虚树真的好吗…… Orz ZYF 我的感悟: dp的过程跟SPOJ 1825 FTOUR2 的做法类似,依次枚举每个子树,从当前子树和之前的部分中各找一条最长 ...
- tomcat怎么运行servlet程序
新建一个web project 取名 myproject 在myproject 新建一个继承了HttpServlet 的类 MyServlet 重写HttpServlet 的 dopost doget ...
- 删除在Godaddy注册的域名,申请退款的全过程
1,删除域名. 登录进 Godaddy ,进入域名管理(Domain Manager),点击你要删除的域名,把要删除的域名前面打上对勾,再点击“delete selected”,确认,稍等一会就删除了 ...
- iphone手机微信端html5 Geolocation定位失效的问题
使用Geolocation方法存在错误信息error.POSITION_UNAVAILABLE 其实问题不局限于微信端而是iphone升级到ios10后,对获取地理位置信息作出了限制,只有https的 ...