《数据结构与算法分析——C语言描述》ADT实现(NO.03) : 二叉搜索树/二叉查找树(Binary Search Tree)
二叉搜索树(Binary Search Tree),又名二叉查找树、二叉排序树,是一种简单的二叉树。它的特点是每一个结点的左(右)子树各结点的元素一定小于(大于)该结点的元素。将该树用于查找时,由于二叉树的性质,查找操作的时间复杂度可以由线性降低到O(logN)。
当然,这一复杂度只是描述了平均的情况,事实上,具体到每一棵二叉搜索树,查找操作的复杂度与树本身的结构有关。如果二叉树的结点全部偏向一个方向,那么与线性查找将毫无区别。这就牵扯到二叉树的平衡问题,暂时不做考虑。
下面给出二叉搜索树的实现。其中,个别可以递归实现的函数,笔者采用了循环的方式。由于递归方法通常较为简洁易懂,在此便不再补充给出。
// BinarySearchTree.h #include <stdio.h>
#include <stdlib.h> struct _TreeNode;
typedef struct _TreeNode TreeNode;
typedef TreeNode *Position;
typedef TreeNode *SearchTree; SearchTree MakeEmpty(SearchTree T);
Position Find(ElementType X, SearchTree T);
Position FindMin(SearchTree T);
Position FindMax(SearchTree T);
SearchTree Insert(ElementType X, SearchTree T);
SearchTree Delete(ElementType X, SearchTree T);
ElementType Retrieve(Position P);
// BinarySearchTree.c #include "BinarySearchTree.h" struct _TreeNode
{
ElementType Element;
SearchTree Left;
SearchTree Right;
int Count;
}; SearchTree MakeEmpty(SearchTree T)
{
if (T != NULL)
{
MakeEmpty(T->Left);
MakeEmpty(T->Right);
free(T);
}
return NULL;
} Position Find(ElementType X, SearchTree T)
{
while (T != NULL)
{
if (T->Element < X)
T = T->Right;
else if (T->Element > X)
T = T->Left;
else
return T;
}
printf("Not found! \n");
return NULL;
} // I write FindMin and FindMax in two different forms. The latter is more clean while the former is more understandable.
Position FindMin(SearchTree T)
{
if (T == NULL)
return NULL;
while (T->Left != NULL)
{
T = T->Left;
}
return T;
} Position FindMax(SearchTree T)
{
if (T != NULL)
while (T->Right != NULL)
T = T->Right;
return T;
} Position CreateNode(ElementType X)
{
Position p;
p = (Position)malloc(sizeof(TreeNode));
if (p == NULL)
{
printf("Error! Out of memory! \n");
return NULL;
}
p->Left = p->Right = NULL;
p->Element = X;
p->Count = 1;
return p;
} // I do this without recursion, so the code is a bit long.
SearchTree Insert(ElementType X, SearchTree T)
{
Position t = CreateNode(X);
Position p = T;
if (T == NULL)
return t;
while (1)
{
if (p->Element < X)
{
if (p->Right != NULL)
p = p->Right;
else
{
p->Right = t;
return T;
}
}
else if (p->Element > X)
{
if (p->Left != NULL)
p = p->Left;
else
{
p->Left = t;
return T;
}
}
else
{
p->Count++;
return T;
}
}
} SearchTree Delete(ElementType X, SearchTree T)
{
Position temp;
int t;
if(T == NULL)
{
printf("Error! The tree is empty! \n");
return NULL;
}
if(T->Element < X)
T->Right = Delete(X, T->Right);
else if(T->Element > X)
T->Left = Delete(X, T->Left);
else
{
if(T->Count > 1)
T->Count--;
else
{
if(T->Left && T->Right)
{
temp = FindMin(T);
t = FindMin(T->Right)->Element;
T->Count = temp->Count;
temp->Count = 1;
Delete(t, T);
T->Element = t;
return T;
}
else if(T->Left)
{
temp = T->Left;
free(T);
return temp;
}
else if(T->Right)
{
temp = T->Right;
free(T);
return temp;
}
else
{
free(T);
return NULL;
}
}
}
} ElementType Retrieve(Position P)
{
return P->Element;
}
至于ADT正确性的测试,可以通过插入、删除结点后设置断点,观察各结点的左右子树元素值,从而与实际插入、删除的情况进行分析比较,判断其是否一致。
如果使用的编程环境进行此操作不甚方便,也可以通过二叉树的前/中/后序遍历序列来对照。
《数据结构与算法分析——C语言描述》ADT实现(NO.03) : 二叉搜索树/二叉查找树(Binary Search Tree)的更多相关文章
- [数据结构]——二叉树(Binary Tree)、二叉搜索树(Binary Search Tree)及其衍生算法
二叉树(Binary Tree)是最简单的树形数据结构,然而却十分精妙.其衍生出各种算法,以致于占据了数据结构的半壁江山.STL中大名顶顶的关联容器--集合(set).映射(map)便是使用二叉树实现 ...
- 二叉搜索树(Binary Search Tree)--C语言描述(转)
图解二叉搜索树概念 二叉树呢,其实就是链表的一个二维形式,而二叉搜索树,就是一种特殊的二叉树,这种二叉树有个特点:对任意节点而言,左孩子(当然了,存在的话)的值总是小于本身,而右孩子(存在的话)的值总 ...
- 数据结构-二叉搜索树(BST binary search tree)
本文由@呆代待殆原创,转载请注明出处:http://www.cnblogs.com/coffeeSS/ 二叉搜索树简介 顾名思义,二叉搜索树是以一棵二叉树来组织的,这样的一棵树可以用一个链表数据结构来 ...
- 【数据结构05】红-黑树基础----二叉搜索树(Binary Search Tree)
目录 1.二分法引言 2.二叉搜索树定义 3.二叉搜索树的CRUD 4.二叉搜索树的两种极端情况 5.二叉搜索树总结 前言 在[算法04]树与二叉树中,已经介绍过了关于树的一些基本概念以及二叉树的前中 ...
- 数据结构——二叉搜索树(Binary Search Tree)
二叉树(Binary Tree)的基础下 每个父节点下 左节点小,右节点大. 节点的插入: 若root==NULL则root=newnode 否则不断与节点值比较,较小则向左比较,较大则向右比较. 完 ...
- 《数据结构与算法分析——C语言描述》ADT实现(NO.00) : 链表(Linked-List)
开始学习数据结构,使用的教材是机械工业出版社的<数据结构与算法分析——C语言描述>,计划将书中的ADT用C语言实现一遍,记录于此.下面是第一个最简单的结构——链表. 链表(Linked-L ...
- 数据结构与算法分析——C语言描述 第三章的单链表
数据结构与算法分析--C语言描述 第三章的单链表 很基础的东西.走一遍流程.有人说学编程最简单最笨的方法就是把书上的代码敲一遍.这个我是头文件是照抄的..c源文件自己实现. list.h typede ...
- 最小正子序列(序列之和最小,同时满足和值要最小)(数据结构与算法分析——C语言描述第二章习题2.12第二问)
#include "stdio.h" #include "stdlib.h" #define random(x) (rand()%x) void creat_a ...
- C语言学习书籍推荐《数据结构与算法分析:C语言描述(原书第2版)》下载
维斯 (作者), 冯舜玺 (译者) <数据结构与算法分析:C语言描述(原书第2版)>内容简介:书中详细介绍了当前流行的论题和新的变化,讨论了算法设计技巧,并在研究算法的性能.效率以及对运行 ...
随机推荐
- 创建文件夹、新建txt文件
1.创建文件夹 QString myMkdir(QString path, QString floderName) //参数 path,创建的文件夹所在路径: 参数floderName,所创建的文件 ...
- Kindle电子书制作
text.html: <!DOCTYPE html> <html lang="en"> <head> <meta http-equiv=& ...
- java-day09
接口 就是一种公共规范标准,只要符合规范标准,就可以大家通用,多个类的公告规范,引用数据类型 格式 public interface 接口名称{} 接口都能定义抽象方法 public abstract ...
- Query Rewrite Plugins
[root@ZST1 ~] mysql -- </usr/local/mysql/share/install_rewriter.sql mydba@ [(none)]> create da ...
- Markdown使用语法
一.标题 一级标题为#号后加空格再加标题内容 二级标题为两个 # 号后加空格再加标题内容 以此类推,支持六级标题 二.字体 1. 加粗 在需要加粗的文字两侧分别用两个 * 包起来 2.斜体 在需要倾斜 ...
- HDU - 2222,HDU - 2896,HDU - 3065,ZOJ - 3430 AC自动机求文本串和模式串信息(模板题)
最近正在学AC自动机,按照惯例需要刷一套kuangbin的AC自动机专题巩固 在网上看过很多模板,感觉kuangbin大神的模板最为简洁,于是就选择了用kuangbin大神的模板. AC自动机其实就是 ...
- 面试系列25 dubbo的spi思想是什么
spi,简单来说,就是service provider interface,说白了是什么意思呢,比如你有个接口,现在这个接口有3个实现类,那么在系统运行的时候对这个接口到底选择哪个实现类呢?这就需要s ...
- 分离vue文件,方便后期维护
参考: https://www.cnblogs.com/wy120/p/10179901.html https://blog.csdn.net/sinat_36146776/article/detai ...
- wget: command not found 解决方案
wget: command not found 解决方案 wget command not found 解决方案 问题分析 解决方案 方法一yum安装wget 方法二rpm安装 问题分析 安装的是Ce ...
- angularjs中使用swiper时不起作用,最后出现空白位
controller.js中定义swipers指令: var moduleCtrl = angular.module('newscontroller',['infinite-scroll','ngTo ...