sbt的详尽资料:http://www.nocow.cn/index.php/Size_Balanced_Tree
个人理解:
先贴自己写的(虽然和cqf大牛的程序如出一辙..原因是太佩服cqf大牛的写法了.)
这个代码只实现了插入、求前驱、排序输出三个功能,但核心部分已经写好了----maintain。其他几个功能的实现,可以参考cqf大牛的官方程序。
attention部分:一开始没有马上理解这个语句,仔细看了下后才理解。这个语句之前,t的左右儿子已经发生了改变,所以顺理成章地,s[t]等于它的左右儿子大小之和加1.佩服cqf大牛写程序时清晰的逻辑!
对insert(var t,v:longint)的理解:这里t前面有个var,使得插入新节点的过程中,该节点的父亲“自动”与它相连,使得代码精炼高效;每次递归完之后,t的值都会被赋值为树根(在maintain中),相当巧妙。
对maintain的理解:对树进行调整的过程,是整个程序中最关键的过程之一。flag用于减少无用计算,属于常数优化。需要优化的情况可以分为两大类,共四种情况,分别用对应maintain过程中的四个if中的旋转操作再递归作用就行了。最后为什么不用maintain(left[t],true)和maintain(right[t],false),cqf大牛的论文里有提及。自己画图看看就明白了。