温故而知新 -> 数据结构 ->树 -> 二叉搜索树
注:若想查看二叉树相关内容,可点击 温故而知新 -> 数据结构 ->树 -> 二叉树;
若想查看其他有关数据结构知识,可点击链接 温故而知新 -> 数据结构 !
二叉树
1、概念
二叉搜索树 又称 二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树:
- 若它的左子树不为空,则左子树上所有节点的值都小于根节点的值
- 若它的右子树不为空,则右子树上所有节点的值都大于根节点的值
- 它的左右子树也分别为二叉搜索树
例如将 int data[] = {4,6,13,5,8,10,12,7,11,9}
以二叉搜索树的结构去构造,结果如下
2、操作
2.1 查找
查找规则 可总结为几句话:
若根节点不为空
- 若根节点
key
== 查找key
, 返回true
- 若根节点
key
> 查找key
,在其左子树查找 - 若根节点
key
< 查找key
,在其右子树查找
若根节点为空,返回 false
!
案例如下
2.2 插入
插入的具体过程如下:
- 树为空,则直接插入
- 树非空,按照二叉搜索树性质查找插入位置,插入新节点
案例如下
2.3 删除
首先查找元素是否在二叉搜索树中,若不存在,则返回;
若存在,则要删除的结点可能分下面四种情况:
- 要删除的结点无孩子结点
- 要删除的结点只有左孩子结点
- 要删除的结点只有右孩子结点
- 要删除的结点有左、右孩子结点
虽然有待删除节点有4种情况,实际 情况1 可以与 情况2 或者 3 合并起来,因此真正的 删除过程 如下:
- 情况2:删除该结点且使被删除节点的双亲结点指向被删除节点的左孩子结点
- 情况3:删除该结点且使被删除节点的双亲结点指向被删除结点的右孩子结点
- 情况4:在它的右子树中寻找中序下的第一个结点(关键码最小),用它的值填补到被删除节点中,再来处理该结点的删除问题
3、实现
根据上述理论知识去依序实现二叉搜索树!
由于代码较多,所以可点击后续链接进行查看!
4、应用
4.1 K模型
K模型 即只有 Key
作为关键码,结构中只需要存储 Key
即可,关键码即为需要搜索到的值。
比如:给一个单词word,判断该单词是否拼写正确,具体方式如下:
- 以单词集合中的每个单词作为key,构建一棵二叉搜索树;
- 在二叉搜索树中检索该单词是否存在,存在则拼写正确,不存在则拼写错误。
4.2 KV模型
每一个关键码 Key
,都有与之对应的值 Value
,即<Key, Value>
的键值对。
比如:实现一个简单的英汉词典dict,可以通过英文找到与其对应的中文,具体实现方式如下:
- <单词,中文含义>为键值对构造二叉搜索树,注意:二叉搜索树需要比较,键值对比较时只比较
Key
- 查询英文单词时,只需给出英文单词,就可快速找到与其对应的
Key
5、拓展内容
5.1 关联式容器
关联式容器 也是用来存储数据的,与序列式容器不同的是,其里面存储的是<key, value>结构的键值对,在数据检索时比序列式容器效率更高。
在C++
中,根据应用场景的不同,STL
总共实现了两种不同结构的管理式容器:树型结构 与 哈希结构。树型结构的关联式容器主要有四种:map
、set
、multimap
、multiset
。这四种容器的共同点是:使用平衡搜索树(即红黑树)作为其底层结果,容器中的元素是一个有序的序列。
这四种容器的一个最大区别是 map
、set
中的key
值不可重复,而其他两种关联式容器可以重复,即带有multi-
的,其key
值都可复!!!!!!
5.2 底层结构
上述四种容器共同点之一为 底层都是按照二叉搜索树来实现的,但是二叉搜索树有其自身的缺陷,假如往树中插入的元素有序或者接近有序,二叉搜索树就会退化成单支树,时间复杂度会退化成O(N)
,因此map
、set
等关联式容器的底层结构是对二叉树进行了平衡处理,即采用平衡树来实现。因此,有了两种二叉搜索树的进阶版:AVL树 与 红黑树!
5.2.1 AVL树
一棵AVL树或者是空树,或者是具有以下性质的二叉搜索树:
- 它的左右子树都是AVL树
- 左右子树高度之差(简称平衡因子)的绝对值不超过
1(-1/0/1)
,即平衡因子的取值范围为[-1,1]
注:平衡因子 = 右子树高度 - 左子树高度
如果一棵二叉搜索树是高度平衡的,它就是AVL树。如果它有n
个结点,搜索时间复杂度O( log2(N))
。比如
5.2.2 红黑树
红黑树,是一种二叉搜索树,但在每个结点上增加一个存储位表示结点的颜色,可以是Red
或Black
。 通过对任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保没有一条路径会比其他路径长出俩倍,因而是接近平衡的。
红黑树的 性质 可分为以下几点
- 每个结点不是红色就是黑色
- 根节点是黑色的
- 如果一个节点是红色的,则它的两个孩子结点是黑色的
- 对于每个结点,从该结点到其所有后代叶结点的简单路径上,均 包含相同数目的黑色结点
- 每个叶子结点都是黑色的(此处的叶子结点指的是空结点)
注意:红黑树红色不能连续,但黑色可以;
红黑树从根节点到叶子节点的最长路径,不会大于最短路径的两倍。
比如下图
由于上述AVL与红黑树两者内容较多,此处就不再展开,后续若有机会再写具体的博客进行叙述!
侵权删~