部分内容引自大佬博客《深入理解二叉搜索树(BST)》https://blog.csdn.net/u013405574/article/details/51058133
二叉搜索树是一种有顺序的二叉树,它具有以下特征:
1.每个元素有一个关键字,并且任意两个元素的关键字都不同;因此所有的关键字都是唯一的。
2.在根节点的左子树中,元素的关键字(如果有的话)都小于根节点的关键字。
3.在根节点的右子树中,元素的关键字(如果有的话)都大于根节点的关键字。
4.根节点的左右子树也是二叉搜索树
二叉搜索树的节点
正如前面所说,每个二叉搜索树的结点,包含关键字key、左孩子指针lchild、右孩子指针rchild以及父结点指针parent。在C++实现中,我们定义一个结点类BSTNode来表示一个结点,并初始化结点的关键字等于0,左右孩子指针和父结点指针为Null
二叉搜索树的查找
二叉树的查找十分简单,只要和节点的关键字对比大小,然后顺着左或者右一路查找下去就可以了,如果查找到叶子节点都没有找到,就返回空。
若假设树的高度是h,那么查找过程的时间复杂度就是O(h),因为我们的二叉树的高度实际上是,所以复杂度实际上是
.
二叉搜索树的插入
BST的插入过程非常简单,很类似与二叉树搜索树的查找过程。当需要插入一个新结点时,从根节点开始,迭代或者递归向下移动,直到遇到一个空的指针NIL,需要插入的值即被存储在该结点位置。这里给出迭代插入算法,递归方式的比较简单。
因为二叉搜索树并不需要考虑平衡问题,所以只要和现有节点对比,向左或者向右走到底,插入子节点即可。
二叉搜索树的删除
二叉搜索树的结点删除比插入较为复杂,总体来说,结点的删除可归结为三种情况:
1、 如果结点z没有孩子节点,那么只需简单地将其删除,并修改父节点,用NIL来替换z;
2、 如果结点z只有一个孩子,那么将这个孩子节点提升到z的位置,并修改z的父节点,用z的孩子替换z;
3、 如果结点z有2个孩子,那么查找z的后继y,此外后继一定在z的右子树中,然后让y替换z。
情况1:
情况2:
情况3:
可分为两种类型,一种是z的后继y位于其右子树中,但没有左孩子,也就是说,右孩子y是其后继。如下:
另外一种类型是,z的后继y位于z的右子树中,但并不是z的右孩子,此时,用y的右孩子替换y,然后再用y替换z。如下:
二叉搜索树的遍历
二叉搜索树的性质允许通过简单的递归算法来输出树中所有的关键字,有三种方式:先序遍历、中序遍历、后序遍历。其中,先序遍历中输出根的关键字在其左右子树的关键字之前;中序遍历中输出根的关键词位于其左子树的关键字和右子树的关键字之间;后序遍历中输出根的关键字在左右子树的关键字之后。