二叉搜索树BST定义:
基于广义二叉树,一颗二叉树定义:或者为空 或者包含三部分:一个值,一个左分支和一个右分支。这两个分支也都是二叉树分支。一颗二叉搜索树是满足下面条件的二叉树:所有左分支的值都小于本节点的值;本节点的值小于所有右分支的值;所以这也代表了BST中的value应当是能够进行大小比较的。
数据结构表示:
通过链表进行表示时,会分为两大部分:value区与索引区:索引区分为left right两个区域,自己实现在某些情况下能够用上parent;value是树中所保存的关键信息;
对于BST书上讲解了四种操作:插入 遍历 搜索 删除
插入:
我们可以使用下面的算法向一颗二叉搜索树插入一个键K:
如果树为空,创建一个叶子节点,令该节点的key = k; 如果k小于根节点的key,将它插入到左子树中; 如果k大于根节点的key,将它插入到右子树中。
存在一个特殊情况,当k等于根节点的key时,说明已经存在。这个时候可以按照具体需求来操作:如重写数据或者忽略。
插入算法是递归或者递推实现的,可以尝试一下。
遍历:
前序遍历 中序遍历 后续遍历
BST的中序遍历是最有特点的。对BST进行中序遍历,元素会按照从小到大的顺序输出,这个是由二叉搜索树的定义决定的。
遍历这个问题可以先通过递归的方式简单进行实现,理解它的定义。实现后通过递推的方式进行实现,对个人的帮助较大。先序遍历 中序遍历可以通过一个栈空间辅助实现。后序遍历会稍微复杂些,也是通过栈实现,其中的元素需要有一个标志位,确定访问次数,确保左右子树均访问后才能将该节点出栈。
搜索:
二叉搜索树有三种搜索:在树中查找一个key,查找最大或最小的元素;查找给定元素的前驱或者后继。
二叉搜索树非常适合进行元素的查找:
如果树为空,查找失败;如果根节点的key等于查找值,查找成功,返回根节点作为结果;如果待查找的值小于根节点的key,继续在左子树中递归查找;如果待查找的值大于根节点的key,继续在右子树中递归查找;
最小元素和最大元素
利用最小元素在树的最左边,最大元素在树的最右边的特性进行查找;
前驱与后继——>容易让人联想到二叉线索树
在实际使用一些数据结构的时候,前驱和后继意义较大。值得研究一下。
删除一个元素
不用真实的删除,单纯的用一个标记位进行标记?
或者通过递归的方式进行删除