zoukankan      html  css  js  c++  java
  • 二叉搜索树倒序O(nlogn)建树

    由于在某些糟糕情况下,二叉查找树会退化成链,故而朴素建树过程其复杂度可能会退化成(O(n^2))

    采用倒序连边建树的方法可以使得二叉查找树建树复杂度稳定在(O(nlogn)).

    具体思路如下:

    • 把待建树的序列(a_1,a_2,a_3,a_4..a_n)(排序,对于每一个)(a_i)求得其在排序后的序列中的前驱pre和后继suc.

    • 倒序遍历序列(a_n),对于(a_i),其一定是其前驱与后继之中的某个的儿子,如果前驱在序列(a_n)比后继靠后(出现的晚),那么ai是前驱的儿子,反之是后继的儿子。//仔细想想,为什么?

    • 更新对应的前驱或后继,并且删除掉(a_i)

    对于第二点,可以理解为建树的过程是把区间不断更新成左右子树的过程。那么对于某一个插入,假设点插入了

    区间[pre+1,suc-1],那么[pre+1,point-1]为左子树,[point+1,suc-1]为右子树。也就是说区间是谁的子树,要看区间端点谁最后出现。

    所以一个二叉查找树一个很重要的性质是:对于每一次插入的结点,其要么是最小的比它大的结点的儿子,要么是最大的比它小的结点的儿子。

    根据这个性质,可以通过树状数组同样完成(O(nlog^2n))建树。

    我们已经知道对于每次插入,我们只需要知道所要插入的点要落在哪个区间,即落在哪两个点之间。

    所以通过树状数组维护前缀和(目的是求插入的点是当前第几大),假设当前的点是第k大,二分查询树状数组

    分别查询出第k-1大对应的位置和第k+1大对应的位置,然后比较这两个位置谁晚出现,即可。

  • 相关阅读:
    在IIS上搭建WebSocket服务器(一)
    ngnix 一 入门指南
    博客园的打赏功能
    Java基础(十)内部类
    Java虚拟机之垃圾回收详解一
    Servlet问题:servlet cannot be resolved to a type解决办法
    WIN7局域网文件共享设置方法
    基于tcp的socket通信
    java基础之抽象类的介绍
    Hdfs详解
  • 原文地址:https://www.cnblogs.com/backkom-buaa/p/11628658.html
Copyright © 2011-2022 走看看