🦄个人主页:修修修也
🎏所属专栏:数据结构
⚙️操作环境:Visual Studio 2022
目录
📌二叉搜索(排序)树的概念
📌二叉搜索(排序)树的操作
🎏二叉搜索树的查找
🎏二叉搜索树的插入
🎏二叉搜索树的删除
结语
📌二叉搜索(排序)树的概念
我们今天要介绍的树是一种非常适合于搜索/排序的树, 当然二叉搜索(排序)树的前提是它是一颗树,并且是一颗二叉树。因此对于树以及二叉树的定义还有不太了解的朋友建议先移步这两篇博客补充一下数据结构树的相关前置知识:
【数据结构】什么是树?https://blog.csdn.net/weixin_72357342/article/details/134973723?spm=1001.2014.3001.5502
【数据结构】什么是二叉树?https://blog.csdn.net/weixin_72357342/article/details/135162895?sharetype=blogdetail&sharerId=135162895&sharerefer=PC&sharesource=weixin_72357342&spm=1011.2480.3001.8118
二叉搜索树(BST, Binary Search Tree) 也称二叉排序树或二叉查找树。它或是一颗空树,或是具有下列性质的二叉树:
- 若它的左子树不为空,则左子树上所有结点的值均小于它的根节点的值。
- 若它的右子树不为空,则右子树上所有结点的值均大于它的根节点的值。
- 它的左右子树也分别为二叉搜索树。
下图罗列了部分属于/不属于二叉搜索树的二叉树以供参考:
对于二叉搜索树而言,其中序遍历的结果恰好是树中所有结点值的有序排列,因此特性也称其为二叉排序树。构造一棵二叉排序树的目的,其实并不是为了排序,而是为了提高查找和插入删除关键字的速度。不管怎么说,在一个有序数据集上的查找,速度总是要快于无序的数据集的,而二叉排序树这种非线性的结构,同样有利于插入和删除操作的实现。
📌二叉搜索(排序)树的操作
以如下二叉搜索树为例, 分别剖析二叉搜索树的查找,插入和删除操作:
int a[] = { 8, 3, 1, 10, 6, 4, 7, 14, 13 };
🎏二叉搜索树的查找
二叉搜索树的查找过程如下:
- 从根节点开始比较查找, 如果查找值比根结点值大,则往右子树继续查找; 如果查找值比根结点值小,则往左子树继续查找;
- 最多查找高度次, 即查找到叶子节点, 如果还没找到, 则该值不存在于此树中。
🎏二叉搜索树的插入
二叉搜索树的插入过程如下:
- 树为空,则直接新增节点,赋值给根节点指针
- 树不为空,则按二叉搜索树性质查找插入位置, 在查找到为空的位置插入新增值, 如果查找到该值已存在, 则返回查找失败(二叉搜索树不允许插入重复值)
🎏二叉搜索树的删除
查找元素是否在二叉搜索中,如果不存在,则返回,如果存在,则待删除结点可能存在以下四种情况:
- 待删除结点无孩子结点
- 待删除结点只有左孩子结点(不管右孩子)
- 待删除结点只有右孩子结点(不管左孩子)
- 待删除结点左,右孩子结点都有
在实际删除操作中,可以将1和2 / 3合并起来,因为我们的逻辑是哪边有孩子就管理,没有孩子就可以不管,因此无孩子结点既可以和不管右孩子结点情况合并又可以和不管左孩子情况合并,合并后实际的删除情况及过程如下三种:
- 删除该结点且使被删除节点的双亲结点指向被删除节点的左孩子结点--直接删除
- 删除该结点且使被删除节点的双亲结点指向被删除结点的右孩子结点--直接删除
- 在它的右子树中寻找中序下的第一个结点(关键码最小),用它的值填补到被删除节点中,再来处理该结点的删除问题--替换法删除
结语
希望这篇关于 二叉搜索(排序)树 的博客能对大家有所帮助,欢迎大佬们留言或私信与我交流.
学海漫浩浩,我亦苦作舟!关注我,大家一起学习,一起进步!
相关文章推荐
【数据结构】什么是线性表?
【数据结构】线性表的链式存储结构
【数据结构】什么是栈?
【数据结构】什么是树?
【数据结构】什么是队列?
【数据结构】什么是堆?
【数据结构】什么是树?
【数据结构】什么是二叉树?