平衡树前置——BST

上一节:平衡树——序

BST(Binary Search Tree)二叉排序树,其定义为:二叉排序树或者是空树,或者是满足如下性质的二叉树:

  ①若它的左子树非空,则左子树上所有结点的值均小于根结点的值;

  ②若它的右子树非空,则右子树上所有结点的值均大于根结点的值;
  ③左、右子树本身又各是一棵二叉排序树。
  上述性质简称二叉排序树性质(BST性质),故二叉排序树实际上是满足BST性质的二叉树。简单解释为左子树.val<根.val<右子树.val。
  显然,BST的中序遍历是val的递增序列。
  BST优美的层次性支持我们插入节点,删除节点,查询前缀后继(以后会解释什么是前缀后继),查询该节点排名,查询第k小(或大)的数。因为比当前节点小的数都在左子树,比当前节点大的数都在右子树,所以在二叉树上不断地递归,很方便就能找到这个数应在的位置。
  但是在本节中我们并不给出BST的实现代码,很简单,BST并不常用(可能除了偷懒没人会在竞赛中码BST_tree)。
  我们来具体解释一下。从时间复杂度的角度分析,在 随机数据(记住这几个字)下,由于二叉树一般会有logn层,所以操作的期望复杂度为O(logn),如图:
   
  当二叉树的左右子树高度差相差不多,我们称之为平衡,但是,一旦有单调的序列插入,那么BST很容易退化成为一条链,那么操作的复杂度就会随之退化为O(n),如图:
  既然单次插入需要O(n),那么总复杂度最坏为O(n^2),BST不适用于特殊构造数据。
  所以我们一般实现BST,而是通过各种手段,使得BST性质不被破坏的同时,令二叉树接近平衡,这就是 平衡树的由来。
  满足BST性质,且中序遍历相同的二叉排序树 不唯一,这使得我们有了改变树的形态而不改变BST性质的基础。
  接下来,我们将介绍treap,一种利用 随机思想维护平衡的平衡树。

猜你喜欢

转载自www.cnblogs.com/Yu-shi/p/10988539.html
BST