zoukankan      html  css  js  c++  java
  • 平衡树前置——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,一种利用随机思想维护平衡的平衡树。

    小舟从此逝,沧海寄余生。

  • 相关阅读:
    解决docker pull很慢的方法
    Linux 基础 Day1
    linux运维人员必须熟悉的运维工具汇总
    chrome 浏览器插件推荐
    只能运维主要职责
    Linux查看所有用户用命令
    ubuntu16.04 离线包安装docker
    2013-10
    ELK原理与介绍
    shell中各种括号的作用()、(())、[]、[[]]、{}
  • 原文地址:https://www.cnblogs.com/Yu-shi/p/10988539.html
Copyright © 2011-2022 走看看