- 1、本文档共16页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
二叉搜索树及应用.ppt
二叉搜索树及应用 Yali 朱全民 二叉搜索树 定义 它或者是一棵空树,或者是具有如下性质的二叉树: 1)若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值 2) 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值 3)它左右子树分别为二叉搜索树。 二叉搜索树的实现 集合{3,4,5,8,19,6} 构造过程1 递归: 建立所有点坐标的映射X p ← 0 作为X映射中的指针 procedure BUILD(ID:integer) begin if (ID*2≤n) then BUILD(ID*2); {左子树} p←p+1; V[ID]=X[p]; if (ID*2+1≤n) then BUILD(ID*2+1); {右子树} end 在主程序中调用BUILD(1) 构造过程2 非递归 方法,依次找出当前点的后继点的下标 第一个点first一定为最下层最左边的一个位置,若n个点有L层,则first=2 L-1 若当前的点位置为now: 如果它有右儿子,即now*2+1=n,则下一 个位置是右子树最左下的点 如果没有右儿子,当now是奇数时,将now除以2,直到now是偶数,最后再将now除以2。 插入一个点x procedure INSERT(x) begin now ← 1 repeat SUM[now]←SUM[now]+1 if (V[now]=x) then break if (V[now]x) then now←now*2 else now←now*2+1 until false end 其中SUM是记录一棵子树上结点总数 删除 的方法是类似的 采矿(KOP) 金矿的老师傅年底要退休了。经理为了奖赏他的尽职尽责的工作,决定送他一块长方形地。长度为S,宽度为W。老师傅可以自己选择这块地。显然其中包含的采金点越多越好。你的任务就是计算最多能得到多少个采金点。如果一个采金点的位置在长方形的边上,它也应当被计算在内。 任务:读入采金点的位置。计算最大的价值。 输入: 文件KOP.IN的第一行是S和W,(1=s,w=10?000);他们分别平行于OX坐标和OY坐标,指明了地域的尺寸。接下来一行是整数n (1=n=15?000),表示采金点的总数。然后是n行,每行两个整数,给出了一个采金点的坐标。坐标范围是(-30?000=x,y=30?000)。 输出: 一个整数,最多的采金点数。 样例 输入 1 2 12 0 0 1 1 2 2 3 3 4 5 5 5 4 2 1 4 0 5 5 0 2 3 3 2 输出 4 对X坐标离散化 对Y坐标进行处理 对于每一种坐标y,建立成两个点事件(y,+1),(y+w+1,-1), 例如在一个带状区域内有5个点的纵坐标分别是{5,3,9,1,9},w=2 那么,有(1,+1),(4,-1),(3,+1),(6,-1),(5,+1),(8,-1),(9,+1),(12,-1), (9,+1),(12,-1), 然后将他们按照y的坐标排序,得(1,+1),(3,+1),(4,-1), (5,+1), (6,-1), (8,-1), (9,+1), (9,+1),(12,-1), (12,-1) 我们把后面的标号反映在一个y坐标的映射上,然后从低到高求和 ,如下图 ? 转换 坐标下的求和,这些和中最大的一个就是该带状区域中一个包含最多点数的矩形 在插入或者删除一个点事件之后,能够维持坐标下∑的值;能够在很短时间内得到∑中最大的一个值? 通过这步巧妙的转换,我们可以用前面的二叉搜索树来实现y坐标的点事件处理。同时前面已经说过,每一个点进出带状区域仅各一次,因此我们要利用树的统计实现:在插入或者删除一个点事件之后,能够维持坐标下∑的值;能够在很短时间内得到∑中最大的一个值。 算法 将所有的点事件映射到y坐标中,最多有n=15000个点,所以可能有30000个不同的坐标,将这些值建立一棵可用以统计的二叉排序树,即BUILD。 在树上的每个结点,要设立两个值。一个是SUM,记录以该点为根的子树上所有点上的值的和,开始时SUM=0。另一个是MAXSUM,记录以该点为根的子树上最大的∑,注意这里的定义是以该结点为根的,也就是在子树上的值。可以通过下面这个函数来完成一个点事件的插入,并且维护SUM和MAXSUM的特性。其中k是一个标号,其值为+1,或者-1。 实现: SUM[now]对应子树上所有+1,-1标号的和。实现极简单. MAXSUM[now],子树上和最大的一个前缀的值。MAXSUM[1]是一种状态下得到最优解。如何维护? MAXSUM[]有哪几种可能? 1 最大值在左树
文档评论(0)