/* 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. ZOJ 1940 Dungeon Master 三维BFS

    Dungeon Master Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Desc ...

  2. PAT甲级1123. Is It a Complete AVL Tree

    PAT甲级1123. Is It a Complete AVL Tree 题意: 在AVL树中,任何节点的两个子树的高度最多有一个;如果在任何时候它们不同于一个,则重新平衡来恢复此属性.图1-4说明了 ...

  3. SlickOne敏捷开发框架介绍(一) -- 基于Dapper, Mvc和WebAPI 的快速开发框架

    前言:在两年前(最初发布时间:2013年1月9日(csdn),当前文章时间2015年11月10日),项目组推出了基于Dapper,Mvc和WebApi的快速开发框架,随着后续Slickflow产品的实 ...

  4. jquery.uploadify 使用过程

    HTML: <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"& ...

  5. WINDOWS WPA性能分析

    http://r12f.com/posts/introduction-to-wpa-1-why-it-is-slow/ http://www.freebuf.com/column/138862.htm ...

  6. 怎样在MyEclipse上耍Chrome

    近期在忙着期末大作业,所以Windows App和算法的专栏都没有更了,随后这几天都会陆续開始更新的,欢迎大家的关注啦-- 在写期末大作业的时候遇到一个问题.一个新的特性在MyEclipse自带的浏览 ...

  7. 使用Microsoft Unity进行日志记录

    需要记录日志的地方包括:进入方法的时候,传参的时候,统计执行时间,方法返回参数的时候,退出语句块的时候,出现异常的时候,等等.先来体验不使用Micirosoft Unity进行日志记录. class ...

  8. dos命令行实践

    本篇体验使用dos命令行窗口实现各种操作. □ 打开dos命令行窗口 →点击电脑左下角"开始"按钮→点击"运行"→输入"cmd",按回车,来 ...

  9. redhat/centos使用service控制启动与关闭

    原文地址: http://guodong810.blog.51cto.com/4046313/1285353 有时,我们自己安装了某个软件时,想让对这个服务更加容易的控制,在redhat/centos ...

  10. 如何精简Unity中使用的字体文件

    在游戏开发过程中,为了UI界面美观和显示效果一致性的考虑,大部分游戏都会使用动态字体来表现文字.尤其在这个看脸的时代,一种字体已经无法满足UI同学对美观的需求,因此我们常常发现若干个小则两三兆,大则十 ...