/* 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语言)的更多相关文章

  1. Redis:安装、配置、操作和简单代码实例(C语言Client端)

    Redis:安装.配置.操作和简单代码实例(C语言Client端) - hj19870806的专栏 - 博客频道 - CSDN.NET Redis:安装.配置.操作和简单代码实例(C语言Client端 ...

  2. 实例15_C语言绘制万年历

    实例说明:

  3. 简单的数据库连接池实例(java语言)

    1.概述 频繁的创建和销毁数据库连接消耗非常多的系统资源,创建一个池子, 管理一定数量的连接,用的时候去池中取,用完了放回池中,这时比较通用的做法. 2.关键字 LinkedList  synchro ...

  4. socket实例C语言:一个简单的聊天程序

    我们老师让写一个简单的聊天软件,并且实现不同机子之间的通信,我用的是SOCKET编程.不废话多说了,先附上代码: 服务器端server.c #include <stdio.h> #incl ...

  5. C 语言实例

    C 语言实例 C 语言实例 - 输出 "Hello, World!" C 语言实例 - 输出整数 C 语言实例 - 两个数字相加 C 语言实例 - 两个浮点数相乘 C 语言实例 - ...

  6. C 语言实例 - 判断字母

    C 语言实例 - 判断字母 C 语言实例 C 语言实例 用户输入一个字符,判断该字符是否为一个字母. 实例 #include <stdio.h> int main() { char c; ...

  7. C 语言实例 - 判断奇数/偶数

    C 语言实例 - 判断奇数/偶数 C 语言实例 C 语言实例 以下实例判断用户输入的整数是奇数还是偶数. 实例 #include <stdio.h> int main() { int nu ...

  8. C 语言实例 - 判断元音/辅音

    C 语言实例 - 判断元音/辅音 C 语言实例 C 语言实例 判断输入的字母是元音,还是辅音. 英语有26个字母,元音只包括 a.e.i.o.u 这五个字母,其余的都为辅音.y是半元音.半辅音字母,但 ...

  9. C 语言实例 - 将字符串写入文件

    C 语言实例 - 将字符串写入文件 C 语言实例 C 语言实例 将字符串写入文件. 实例 #include <stdio.h> #include <stdlib.h> /* e ...

随机推荐

  1. GIT(5)----常用命令:新分支,切换,删除,远程推送,标签,日志

    常用命令 1.新分支 创建新分支:git branch <branch_name> 创建分支并切换到新的分支上:git checkout -b <branch_name> 2. ...

  2. 关于php一些问题

    为什么说php是弱语言? 本身不严格区分变量的类型. 为什么说php是动态语言? 程序在运行时可以改变其结构.所谓的动态类型语言,意思就是类型的检查是在运行时做的. 为什么说php是脚本语言? 不需要 ...

  3. LogStash日志分析系统

    简介 通常日志管理是逐渐崩溃的——当日志对于人们最重要的时候,也就是出现问题的时候,这个渐进的过程就开始了.日志管理一般会经历一下3个阶段: 初级管理员将通过一些传统工具(如cat.tail.sed. ...

  4. mysql学习之二:mysql基本使用方法

    安装完mysql后我们能够进行sql语句的操作: 我们能够使用下面命令连接到MySQL服务: mysql -h localhost -u root -p -h參数指定要连接的MySQLserver地址 ...

  5. hdu 4647 Another Graph Game,想到了就是水题了。。

    题目是给一个无向图,其中每个节点都有点权,边也有边权,然后就有2个小朋友开始做游戏了ALICE &BOB 游戏规定ALICE 先行动然后是BOB,然后依次轮流行动,行动时可以任意选取一个节点并 ...

  6. MVC文件上传08-使用客户端jQuery-File-Upload插件和服务端Backload组件让每个用户有专属文件夹

    当需要为每个用户建立一个专属上传文件夹的时候,可以在提交文件的视图中添加一个隐藏域,并设置name="objectContext". 相关兄弟篇: MVC文件上传01-使用jque ...

  7. jsp页面传递参数是如何与javabean进行关联的

    总结:1.severlet容器是通过JavaBean中的属性方法名来获取属性名的,然后根据此属性名来从request中取值 2.JavaBean中属性方法的命名,set后的名称要与你从request中 ...

  8. jsp中excel文件的创建与读取

    1.创建excel文件//这里的jxl不是java的标准jar包,需要在项目中另外加载 import jxl.Workbook; import jxl.write.Label; import jxl. ...

  9. [翻译] AnimatedPath 动画路径(持续更新)

    AnimatedPath动画路径 感谢原作者分享精神,有空补上使用教程 https://github.com/twotoasters/AnimatedPath AnimatedPath explore ...

  10. 【BZOJ】【2850】【Violet 0】巧克力王国

    KD-Tree 问平面内在某条直线下方的点的权值和 我一开始yy的是:直接判这个矩形最高的两个点(y坐标的最大值)是否在这条直线下方就可以了~即判$A*x+B*y<C$... 然而这并不对啊…… ...