划分树的建树与查询的理解

来源:互联网 发布:c语言cin怎么用 编辑:程序博客网 时间:2024/09/21 08:16

http://blog.csdn.net/pi9nc/article/details/8996939

首先先参考这篇博客通俗易懂,,接下来说说在上面这博客中 博主不懂的地方 也就是查询操作中newl 和newr的值的确定:

首先:newl 和newr的取值目的是确定在划分树当前层的下一层中的左区间(子树) 或者右区间(子树)中需要查询的区间范围,也就是newl和newr;

其次:

1,查询的数在左子树中,即k<=ss,那么newl=left+s,因为s的含义是qleft左边的数在下一层的左区间内有多少个,而这s个数并不包含要查询的数也就是不需要的数,所以left+s的位置是左区间中第一个需要查询的数的位置;另外newr=left+(s+ss)-1同理,-1的原因:因为left+s的位置是左区间中第一个需要查询的数的位置,那么从这个位置起需要查询接下来的ss个数,所以-1之后就是需要查询的区间终点;


2,查询的数在右子树中,即k>ss,那么newl=mid-left+1+qleft-s,首先mid-left+1的意思就是左区间的数的个数,而我们要确定是右区间的起点。因为s的含义是qleft左边的数在下一层的左区间内有多少个,反过来就是说qleft-s的意思就是qleft左边的数出现在右区间的数的个数,而这些数是不在查询范围内的,所以查询起点newl就确定好了。对于newr=mid-left+1+qright-s-ss,(qright-s-ss)的意思就是下一层所需要查询的区间的数的个数。

0 0
原创粉丝点击