标签:这个 删除 BST 儿子 排名 253 平衡 节点 AcWing
一、题目解析
平衡树,\(Treap\)
众所周知\(Treap = BST + heap\)
堆不多说了。
说说这个\(BST\),就是说一个根节点\(p\),左儿子一定小于他,右儿子大于它。
也就是\(BST\)的中序遍历是严格单调递增的。
那么就可以进行一些操作了。
-
左旋与右旋
首先为了维护这个\(BST\)我们需要一个左旋\(zag\)和右旋\(zig\),分别表示将根节点和左右儿子交换位置,使交换后还满足\(BST\)的性质。
这个相当于一个模拟了,代码放在后面。
-
插入
这个可以从根节点开始,看看往左儿子走还是往右儿子走,一直走到空或者和自己相等的节点,然后进行插入。
-
删除
从根节点走,走到了这个节点就删除掉,如果走到的节点为空,那就不用管了,因为这个节点不存在。还有就是删除的时候如果遇到了叶节点可以直接删除,不会影响\(BST\)的性质。
-
最大最小
就是一直往左走或者一直往右走。 -
查排名和排名对应的数
排名可以一点点走,然后分类讨论,这个可以看代码注释。
排名对应的数也是一样,但这个得判断一下个数,所以\(BST\)里要有\(cnt\)和\(size\)两个变量表示节点个数和当前这个节点有多少个。
-
前驱和后继
具体定义参见题目描述。方法也是一样,前驱就是左边最大的,后继就是右边最小的,可以用递归写,会简单很多。
但是有的时候\(BST\)会退化成一条链,时间复杂度就大大升高了,但是只要\(BST\)够随机,期望高度就是\(log_2n\)。
所以的话就把它和堆集合在了一起,变成了平衡树。
其他的注释我放到代码里了。
标签:这个,删除,BST,儿子,排名,253,平衡,节点,AcWing 来源: https://www.cnblogs.com/littlehb/p/16241238.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。