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


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

    在这里插入图片描述

    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.keyz.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.keyz.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.keyz.key<x.key相矛盾,所以不成立;若 z z z y y y的父亲结点且结点 y y y z z z的左孩子结点,此时 x . k e y < z . k e y x.keyx.key<z.key,与假设 z . k e y < x . k e y z.keyz.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\{

    m[left[x]]v[left[x]]+p[x]v[left[x]]+p[x]+m[right[x]" role="presentation">m[left[x]]v[left[x]]+p[x]v[left[x]]+p[x]+m[right[x]
    \right. m[x]= m[left[x]]v[left[x]]+p[x]v[left[x]]+p[x]+m[right[x]

  • 相关阅读:
    直流电源供电 LED升压 恒流驱动IC 方案AP9193
    SpringBoot实战(1)
    宝塔天翼云部署记录
    Spring IoC依赖注入-6
    2.22号qt
    袋鼠云数栈UI5.0设计实战|B端表单这样设计,不仅美观还提效
    大模型时代,探人工智能发展的新动向
    非技术背景项目经理如何发展?
    SpringMVC之JSON数据返回与异常处理机制
    竞赛选题 基于深度学习的人脸识别系统
  • 原文地址:https://blog.csdn.net/weixin_56462041/article/details/127329022