概念:
二叉搜索树是一棵二叉树或者空树,又名二叉排序树,英文简写为 BST (Binary Search Tree)
性质:
- 若它的左子树不为空,则左子树上所有节点的值都小于根节点的值
- 若它的右子树不为空,则右子树上所有节点的值都大于根节点的值
- 它的左右子树也分别为二叉搜索树
它的性质使得它中序遍历这棵树一定会得到有序序列
存储底层:
链式存储
性能:
插入和删除操作都必须先查找,所以查找效率代表了二叉搜索树中各个操作的性能。
二叉搜索树的对于一个数据的查找次数为树的高度。
最优情况下:二叉搜索树为完全二叉树或接近完全二叉树时,平均效率为:O(logn)
最差情况下:二叉搜索树退化为单支树(或者类似单支),其平均效率为:O(n)
因为是链式存储,所以增删效率在最优情况下是很客观的,但在最坏情况下却不行,所以二叉搜索树的进阶:AVL树和红黑树便对其进行了优化,解决了退化的情况。
使用:
搜索二叉树的作用并不广泛,但它作为 AVL树 和 红黑树 的基础是必不可少的。
我们可以简单理解一下它的增删查改等操作。
查找:
比当前根节点大往右树走,小就往左树走,然后对这棵子树进行一样的操作,相等就找到,最后走到空节点还未走到就是不存在(注意,若有相同值的节点,这样找到的节点会是最左边的那个,因为中序遍历下最左是第一个)
增加:
先进行和查找一样的动作,插入值比当前根节点大就往右树走,小就往左树走,相同往左往右都可,为空就插入
例:
插入一个5,小于8左走,大于3右走,小于6左走,大于4右走,最后值为4的节点没有右节点,它的右节点为空,就插入那个位置,结果如下:
删除:
先进行查找,将这个要删除的值替换为 其左子树的最大值或其右子树的最小值,最后删除这个左子树的最大值或右子树的最小值即可。
因为二叉搜索树的特性,它的最大值在树的最右侧,最小值在树的最左侧,所以必定是叶子节点,可以直接删除。
例:
删除值为3的节点,并且我们用它右子树的最小值代替,结果如下:
对此可以用个比喻来解释:因为二叉搜索树用中序遍历那么得到的就是有序数列,如上图例子得到的序列就是:
1 3 4 6 7 8 10 13 14
然后我们删除了3,要么 3 原本的位置要么是它右边序列左移,最后也就是 4 覆盖了3的位置,要么左边序列右移,最后也就是 1 覆盖了原来的位置。这就是为什么要用左树的最大值或右树的最小值代替删除值。
完。