二叉搜索树的顺序性

------------------siwuxie095

二叉搜索树的顺序性

二叉搜索树具有一定的顺序性,即
使用二叉搜索树可以回答很多

元素之间的和顺序相关的问题,如下:

(1)minimum 和 maximum

通过二叉搜索树可以非常容易地找到一组数据中最小的元素
minimum

和最大的元素
maximum

(2)predecessor 和 successor

通过二叉搜索树可以非常容易地找到一个元素的前驱 predecessor

和后继 successor

(3)floor 和 ceil

通过二叉搜索树还可以找到一个元素的
floor 相应的值

和 ceil 相应的值

floor 和 ceil 与 predecessor 和 successor 的最大的一个区别就是:

要想找到一个元素的前驱和后继,首先要保证这个元素真的存在

如果要找一个元素的
floor 和 ceil:

1)如果该元素存在,那么该元素的
floor 和 ceil 就是该元素本身

2)如果该元素不存在,那么该元素的
floor 和 ceil 也是存在的,

分别是最后一个比该元素小的值和第一个比该元素大的值,即

接近的两个值。当然,也有可能该元素并没有
floor 或 ceil

(4)rank 和 select

通过二叉搜索树还可以找到一个元素的排名
rank

和找到某排名(如:第 100 名)的元素
select

但遗憾的是一般的二叉搜索树并不能回答这两个问题,可做如下改动:

对二叉搜索树的每一个节点多添加一个属性(域),该属性用于存储

以当前节点为根的二叉搜索树一共有几个节点

之后就可以利用二叉搜索树的性质:每个节点的键值都大于左孩子


每个节点的键值都小于右孩子,来实现
rank 和 select

注意:在给节点 Node 添加新属性后,编写 rank 和 select 这两个

函数并不难,难的是要在之前实现的
insert 和 remove 这两个函数

中同时维护新属性,使得当用户调用
rank 和 select 这两个函数时,

能够得到正确的结果

另外:

一般的二叉搜索树,是不支持整棵树中存在重复元素的,但在

有些情况下,需要二叉搜索树支持重复元素,该怎么做呢?

一个最简单的方法,就是直接让这棵树可以存在重复元素,即

把一个节点的左孩子,定义成是小于等于这个节点的元素,右

孩子是大于这个节点的元素

不过当存在大量重复元素时,这样做不够节省空间

为此,依然可以通过更改节点 Node 的结构来解决,具体如下:

对二叉搜索树的每一个节点多添加一个属性
count,该属性用于存储

当前节点所代表的元素在二叉搜索树中的个数

此时,构建出这样一棵二叉搜索树很容易,不过当每个节点都多出一个

count 属性后,相应的 insert 和 remove,以及 rank 和 select 等等都

要发生改变,以维护
count 属性

【made by siwuxie095】

时间: 2024-12-05 19:00:59

二叉搜索树的顺序性的相关文章

二叉搜索树的局限性

-------------------siwuxie095 二叉搜索树的局限性 二叉搜索树在时间性能上是具有局限性的 同样的数据,可以对应不同的二叉搜索树,如下: 二叉搜索树可能退化成链表,相应的,二叉搜索树的查找操作是和这棵树 的高度相关的,而此时这颗树的高度就是这颗树的节点数 n,同时二叉搜 索树相应的算法全部退化成 O(n) 级别 显然,说二叉搜索树的查找.插入.删除 这三个操作都是 O(lgn) 级别的, 只是一个大概的估算,具体要和二叉搜索树的形状相关 二叉搜索树并不能像堆那样,保证所

二叉搜索树的查找

---------------------siwuxie095 二叉搜索树的查找 程序:二叉搜索树和顺序查找表的查找对比 FileOps.h: #ifndef FILEOPS_H #define FILEOPS_H #include <string> #include <iostream> #include <fstream> #include <vector> using namespace std; namespace FileOps { int fir

剑指Offer(Java版)第六十五题:给定一棵二叉搜索树,请找出其中的第k小的结点。 例如, (5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4。

/*给定一棵二叉搜索树,请找出其中的第k小的结点.例如, (5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4.*//*二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值: 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值*///思路:从最左边的叶子节点开始找起. import java.util.*; public clas

PAT树_层序遍历叶节点、中序建树后序输出、AVL树的根、二叉树路径存在性判定、奇妙的完全二叉搜索树、最小堆路径、文件路由

<pre class="code"><span style="font-family: %value; font-size: 14px;">03-树1. List Leaves (25) Given a tree, you are supposed to list all the leaves in the order of top down, and left to right. Input Specification: Each inpu

二叉搜索树以及对二叉搜索树平衡调整

代码的思想和图片参考:好大学慕课浙江大学陈越.何钦铭的<数据结构> 我们首先介绍一下什么是二叉搜索树和二叉平衡树: 二叉搜索树:一棵二叉树,可以为空:如果不为空,满足以下性质1. 非空左子树的所有键值小于其根结点的键值.2. 非空右子树的所有键值大于其根结点的键值.3. 左.右子树都是二叉搜索树. 二叉搜索树操作的特别函数:Position Find( ElementType X, BinTree BST ):从二叉搜索树BST中查找元素X,返回其所在结点的地址,查找的次数取决于树的高度  

数据结构-二叉搜索树(BST binary search tree)

本文由@呆代待殆原创,转载请注明出处:http://www.cnblogs.com/coffeeSS/ 二叉搜索树简介 顾名思义,二叉搜索树是以一棵二叉树来组织的,这样的一棵树可以用一个链表数据结构来表示,每个节点除了key和卫星数据(除了二叉树节点的基本数据以外人为添加的数据,这些数据和树的基本结构无关),还有left.right.parent,分别指向节点的左孩子.右孩子和父节点,如果对应的节点不存在则指向NIL节点(因为最简单的二叉搜索树中的NIL节点里并没有有用的信息,所以在实现的时候简

数据结构第三部分:树与树的表示、二叉树及其遍历、二叉搜索树、平衡二叉树、堆、哈夫曼树、集合及其运算

参考:浙大数据结构(陈越.何钦铭)课件 1.树与树的表示 什么是树? 客观世界中许多事物存在层次关系 人类社会家谱 社会组织结构 图书信息管理 分层次组织在管理上具有更高的效率! 数据管理的基本操作之一:查找(根据某个给定关键字K,从集合R 中找出关键字与K 相同的记录).一个自然的问题就是,如何实现有效率的查找? 静态查找:集合中记录是固定的,没有插入和删除操作,只有查找 动态查找:集合中记录是动态变化的,除查找,还可能发生插入和删除 静态查找——方法一:顺序查找(时间复杂度O(n)) int

【数据结构】树与树的表示、二叉树存储结构及其遍历、二叉搜索树、平衡二叉树、堆、哈夫曼树与哈夫曼编码、集合及其运算

1.树与树的表示 什么是树? 客观世界中许多事物存在层次关系 人类社会家谱 社会组织结构 图书信息管理 分层次组织在管理上具有更高的效率! 数据管理的基本操作之一:查找(根据某个给定关键字K,从集合R 中找出关键字与K 相同的记录).一个自然的问题就是,如何实现有效率的查找? 静态查找:集合中记录是固定的,没有插入和删除操作,只有查找 动态查找:集合中记录是动态变化的,除查找,还可能发生插入和删除 静态查找--方法一:顺序查找(时间复杂度O(n)) int SequentialSearch(St

用JS实现二叉搜索树

二叉树的节点最多只能有两个子节点,一个左侧子节点,一个右侧子节点. 二叉搜索树(BST),是二叉树的一种,但只允许在左侧节点存储比父节点小的值,在右侧节点存储比父节点大或等于父节点的值. 1.创建BST 1.1创建BST类 首先申明BST类的基本结构 function BinarySearchTree() { var Node = function(key){ this.key = key; this.left = null; this.right = null; }; var root = n