《数据结构与算法分析——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版)>内容简介:书中详细介绍了当前流行的论题和新的变化,讨论了算法设计技巧,并在研究算法的性能.效率以及对运行 ...
随机推荐
- AtCoder ABC 129E Sum Equals Xor
题目链接:https://atcoder.jp/contests/abc129/tasks/abc129_e 题目大意 给定一个二进制表示的数 L,问有多少对自然数 (a, b) 满足 $a + b ...
- Vue 中 computed ,watch,methods 的异同
methods,watch和computed都是以函数为基础的. computed 和 watch 都可以观察页面的相应式数据的变化.当处理页面的数据变化时,我们有时候很容易滥用watch, 而通常更 ...
- nvelocity的Foreach 中使用DataTable数据
原文:nvelocity的Foreach 中使用DataTable数据 tripDetailList是一个DataTable类型的数据,Logo.TripTypeName.TipTypePrice等为 ...
- 判断Paging File 的方法
当前环境,MiniFilter 1:FsRtlIsPagingFile 参数是一个 FileObject 2:判断操作标识 SL_OPEN_PAGING_FILE FlagOn 宏可以直接做到,传 ...
- layui+croppers完成图片剪切上传
不多说直接上代码: 前台代码: <!DOCTYPE html> <html> <head> <meta charset="utf-8" / ...
- spring基于xml的IOC环境搭建和入门
配置pom.xml的依赖 <packaging>jar</packaging> <dependencies> <dependency> <grou ...
- ArrayBlockingQueue 和LinkedBlockQueue
ArrayBlockingQueue ArrayBlockingQueue是Java多线程常用的线程安全的一个集合,基于数组实现,继承自AbstractQueue,实现了BlockingQueue和S ...
- input 数值验证
1.手动校验数字为整数 Number.isInteger <el-input class="radioInput" v-model.number="ruleForm ...
- 2.vue插件总结——总有你能用上的插件
UI组件 框架 element - 饿了么出品的Vue2的web UI工具套件 mint-ui - Vue 2的移动UI元素 iview - 基于 Vuejs 的开源 UI 组件库 Keen-UI - ...
- 2016.10.5初中部上午NOIP普及组比赛总结
2016.10.5初中部上午NOIP普及组比赛总结 这次的题目出得挺有质量的.但我觉得我更应该努力了. 进度: 比赛:0+20+0+0=20 改题:AC+AC+AC+AC=AK kk的作业 这题我错得 ...