二叉搜索树倒序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大对应的位置,然后比较这两个位置谁晚出现,即可。
二叉搜索树倒序O(nlogn)建树的更多相关文章
- 天梯赛练习 L3-010 是否完全二叉搜索树 (30分) 数组建树模拟
题目分析: 本题的要求是将n个数依次插入一个空的二叉搜索树(左大右小,且没有重复数字),最后需要输出其层次遍历以及判断是否是完全二叉搜索树,通过观察我们发现, 如果这个树是用数组建立的,那么最后输出的 ...
- L2-004 这是二叉搜索树吗? (25 分) (树)
链接:https://pintia.cn/problem-sets/994805046380707840/problems/994805070971912192 题目: 一棵二叉搜索树可被递归地定义为 ...
- PAT 天梯赛 L3-010. 是否完全二叉搜索树 【Tree】
题目链接 https://www.patest.cn/contests/gplt/L3-010 思路 因为是 完全二叉搜索树 可以用 数据 建树的方式 然后 遍历一遍这个 数字 就是 层序遍历 遍历的 ...
- PTA 7-1 是否完全二叉搜索树 (30分)
PTA 7-1 是否完全二叉搜索树 (30分) 将一系列给定数字顺序插入一个初始为空的二叉搜索树(定义为左子树键值大,右子树键值小),你需要判断最后的树是否一棵完全二叉树,并且给出其层序遍历的结果. ...
- Luogu P1377 [TJOI2011]树的序:离线nlogn建二叉搜索树
题目链接:https://www.luogu.org/problemnew/show/P1377 题意: 有一棵n个节点的二叉搜索树. 给出它的插入序列,是一个1到n的排列. 问你使得树的形态相同的字 ...
- PAT树_层序遍历叶节点、中序建树后序输出、AVL树的根、二叉树路径存在性判定、奇妙的完全二叉搜索树、最小堆路径、文件路由
03-树1. List Leaves (25) Given a tree, you are supposed to list all the leaves in the order of top do ...
- [LC] 108题 将有序数组转换为二叉搜索树 (建树)
①题目 将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树. 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1. 示例: 给定有序数组: [-10,- ...
- [数据结构]——二叉树(Binary Tree)、二叉搜索树(Binary Search Tree)及其衍生算法
二叉树(Binary Tree)是最简单的树形数据结构,然而却十分精妙.其衍生出各种算法,以致于占据了数据结构的半壁江山.STL中大名顶顶的关联容器--集合(set).映射(map)便是使用二叉树实现 ...
- [LeetCode] Binary Search Tree Iterator 二叉搜索树迭代器
Implement an iterator over a binary search tree (BST). Your iterator will be initialized with the ro ...
随机推荐
- 利用JQuery一步步打造无缝滚动新闻
首先,我们这里有这么一段html代码,很简洁,如下所示: 1 <div id="tag">2 <ul>3 <li>你说我是好人吗,我是好人啊&l ...
- eclipse svn同步过滤掉某些不需要同步的文件
注:这里说的svn是eclipse里svn插件 默认情况下,我们在点击svn同步时,总是会把一些不需要的目录和文件也给同步了,这样我觉得很晃眼睛,所以在这里说下怎么去去掉不想同步的文件 1.默认同步下 ...
- kubernetes运用
1:kubernetes基本介绍 kubernetes 是一个开源的容器集群管理系统,K8s用于容器化应用程序的部署 扩展和管理,提供容器编排 资源调度 弹性伸缩 部署管理 服务发现等一系列功能. ...
- C++:std::map的遍历
for (auto &kv : myMap) { count<<kv.first<<" has value "<<kv.second&l ...
- ant design 的表格默认选中
在使用 ant design 的表格时候使用默认选中项, 需要配置的 Table 的 rowSelection const rowSelection = { type: 'checkbox', get ...
- ship(动态规划)
(ships.pas/c/cpp) 来源:<奥赛经典>(提高篇)[问题描述]PALMIA国家被一条河流分成南北两岸, 南北两岸上各有N个村庄. 北岸的每一个村庄有一个唯一的朋友在南岸,且他 ...
- zabbix服务端连接客户端报错Received empty response from Zabbix Agent at [192.168.10.105]. Assuming that agent dropped connection because of access permissions
这是zabbix WEB报的问题:Received empty response from Zabbix Agent at [192.168.10.105]. Assuming that agent ...
- python学习之路(2)(渗透信息收集)
scapy的用法 通过目标ip的回复判断目标ip主机的情况 先写上三层的IP 四层的TCP 然后r.display看一下我们的包 src是源ip dst是目标ip 我们添加目标ip 这里是网关的ip ...
- C++入门经典-例2.9-输出十六进制数以及大写的十六进制数
1:代码如下: #include "stdafx.h" #include <iostream> #include <iomanip> using names ...
- snmpEngineBoots & snmpEngineID数据存储到非易失性存储设备
#include <stdio.h> #include <stdlib.h> #include <string.h> int regenerateID() { ; ...