算法导论习题—二叉搜索树、红黑树、区间树

41 篇文章 1 订阅
40 篇文章 6 订阅

算法基础习题—二叉搜索树、红黑树、区间树

在这里插入图片描述

1.二叉搜索树:

T T T是一棵二叉搜索树,其关键字互不相同;设 x x x是一个叶结点, y y y为其父结点。证明: y . k e y y.key y.key或者是 T T T树中大于 x . k e y x.key x.key的最小关键字,或者是 T T T树中小于 x . k e y x.key x.key的最大关键字。

1. 1. 1. x x x y y y的左孩子结点时:
假设在树 T T T中存在一个结点 z z z满足 z . k e y > x . k e y   & &   z . k e y < y . k e y z.key>x.key\ \&\&\ z.key<y.key z.key>x.key && z.key<y.key,由于 T T T是一棵关键字互不相同的二叉搜索树,所以结点 z z z只能是结点 y y y的左孩子结点,或者是 y y y的父亲结点且结点 y y y是结点 z z z的右孩子结点。
对上述两种情况,若结点 z z z是结点 y y y的左孩子结点,由于 x x x y y y的左孩子结点且 x x x是一个叶结点,所以此时结点 z z z就是结点 x x x,与假设 z . k e y > x . k e y z.key>x.key z.key>x.key相矛盾,所以不成立;若 z z z y y y的父亲结点且结点 y y y z z z的右孩子结点,此时 x x x y y y都在结点 z z z的右子树中,所以此时虽然 z . k e y < y . k e y z.key<y.key z.key<y.key x . k e y > z . k e y x.key>z.key x.key>z.key,与假设 z . k e y > x . k e y z.key>x.key z.key>x.key相矛盾,所以当 x x x y y y的左孩子结点时: y . k e y y.key y.key T T T树中大于 x . k e y x.key x.key的最小关键字。
2. 2. 2. x x x y y y的右孩子结点时:
同理,结点 z z z只能是结点 y y y的右孩子结点,或者是 y y y的父亲结点且结点 y y y是结点 z z z的左孩子结点。若结点 z z z是结点 y y y的右孩子结点,则此时结点 z z z就是结点 x x x,与假设 z . k e y < x . k e y z.key<x.key z.key<x.key相矛盾,所以不成立;若 z z z y y y的父亲结点且结点 y y y z z z的左孩子结点,此时 x . k e y < z . k e y x.key<z.key x.key<z.key,与假设 z . k e y < x . k e y z.key<x.key z.key<x.key相矛盾,所以当 x x x y y y的右孩子结点时: y . k e y y.key y.key T T T树中小于 x . k e y x.key x.key的最大关键字。
综上, y . k e y y.key y.key或者是 T T T树中大于 x . k e y x.key x.key的最小关键字,或者是 T T T树中小于 x . k e y x.key x.key的最大关键字。

在这里插入图片描述

2.红黑树:

( a ) (a) (a)将关键字 41 , 38 , 31 , 12 , 19 , 8 41,38,31,12, 19,8 41,38,31,12,19,8连续地插入一棵初始为空的红黑树之后,试画出该结果树。
( b ) (b) (b)对于 ( a ) (a) (a)中得到的红黑树,依次删除 8 , 12 , 19 8, 12, 19 8,12,19试画出每次删除操作后的红黑树。

( a ) (a) (a)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

( b ) (b) (b)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.区间树:

假设我们希望记录一个区间集合的最大重叠点,即被最多数目区间所覆盖的那个点。
( a ) (a) (a)证明:在最大重叠点中,一定存在一个点是其中一个区间的端点。
( b ) (b) (b)设计一个数据结构,使得它能够有效地支持 I N T E R V A L − I N S E R T 、 I N T E R V A L − D E L E T E INTERVAL-INSERT、INTERVAL-DELETE INTERVALINSERTINTERVALDELETE以及返回最大重叠点的 F I N D − P O M FIND-POM FINDPOM操作。

( a ) (a) (a)
假设取得一个不在区间端点上的最大重叠点,对于这个点,其所在的区间的左端点或右端点中,必定存在一个端点与这个最大重叠点有着相同的区间数,所以,在最大重叠点中,一定存在一个点是其中一个区间的端点。
( b ) (b) (b)
使用红黑树存储各个区间的端点值,对于每个结点 x x x有附加信息 p ( x ) 、 v ( x ) p(x)、v(x) p(x)v(x),若结点为一个左端点,则 p ( x ) = 1 p(x)=1 p(x)=1,否则 p ( x ) = − 1 p(x)=-1 p(x)=1 v ( x ) v(x) v(x)存储以 x x x为根结点的所有子结点 p p p值与 x . p x.p x.p与的和。
v [ x ] = v [ l e f t [ x ] ] + p [ x ] + v [ r i g h t [ x ] ] v[x]=v[left[x]]+p[x]+v[right[x]] v[x]=v[left[x]]+p[x]+v[right[x]]

I N T E R V A L − I N S E R T INTERVAL-INSERT INTERVALINSERT
只需将执行插入操作时经过的所有结点 v v v值加上所插入结点的 p p p值,其余操作与红黑树的插入操作相同。
I N T E R V A L − D E L E T E INTERVAL-DELETE INTERVALDELETE
只需将执行删除操作时经过的所有结点 v v v值减去被删除结点的 p p p值,其余操作与红黑树的删除操作相同。
F I N D − P O M FIND-POM FINDPOM:
给定 n 2 \cfrac{n}{2} 2n个区间,那么总共有 n n n个端点,将这 n n n个端点按升序排列,若当前是点 i i i,则如果在 i i i之前出现的区间,只出现了左端点,还没有出现右端点,那么说明该区间与 i i i所在区间重叠。如果在 i i i之前该区间左右端点都出现过了,那就不会与 i i i所在区间重叠,即左端点 p = + 1 p=+1 p=+1,右端点 p = − 1 p=-1 p=1,相加为 0 0 0
s ( i , j ) = p ( i ) + p ( i + 1 ) + . . . + p ( j ) s(i,j)=p(i)+p(i+1)+...+p(j) s(i,j)=p(i)+p(i+1)+...+p(j),即从点 i i i到点 j j j p p p值之和,则根据上述内容可知 s ( i , j ) s(i,j) s(i,j)就是 j j j点的重叠区间数。
对于结点 x x x,记以 x x x为根结点的子树中的最小端点值为 l ( x ) l(x) l(x),最大端点值为 r ( x ) r(x) r(x),为 x x x结点扩张一个额外信息 m [ x ] = m a x { s ( l ( x ) , i ) } , for i in { l ( x ) , . . . , r ( x ) } m[x]=max\{\text{s}(l(x),i)\}, \text{for i in}\{l(x),...,r(x)\} m[x]=max{s(l(x),i)},for i in{l(x),...,r(x)},则 m [ x ] m[x] m[x]就是以 x x x为根节点的树中最大重叠点的重叠数。
再在红黑树中通过分治找出对应的 m [ x ] m[x] m[x],最大重叠点存在三种情况: 1. 1. 1.就是根节点 2. 2. 2.在左子树中 3. 3. 3.在右子树中,在左右子树中递归调用求 m [ x ] m[x] m[x]的方法。
m [ x ] = { m [ l e f t [ x ] ] v [ l e f t [ x ] ] + p [ x ] v [ l e f t [ x ] ] + p [ x ] + m [ r i g h t [ x ] m[x]=\left\{ \begin{aligned} &m[left[x]]\\ &v[left[x]]+p[x]\\ &v[left[x]]+p[x]+m[right[x] \end{aligned} \right. m[x]= m[left[x]]v[left[x]]+p[x]v[left[x]]+p[x]+m[right[x]

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

之墨_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值