代码改变世界

算法导论-红黑树习题解

2012-04-27 15:02  meteorgan  阅读(876)  评论(0编辑  收藏  举报

13.2-4 证明:任何一棵含n个节点的二叉查找树,可以通过O(n)次旋转,转变成另一棵含n个节点的二叉查找树。

  解:1. 任意一棵含n个节点的二叉查找树可以通过至多n-1次右旋操作变成一棵仅有右孩子的单链树(这可以通过对每个有左孩子的节点进行右旋来完成)。

    2. 可以通过1中的反向操作将一个仅有右孩子的单链树变成一棵二叉查找树。

    3. 通过步骤1, 2可以在2n-2步内将任意一棵含n个节点的二叉查找树转变成一棵含n个节点的二叉查找树。

 

13.3-6 说明如果红黑树的表示中不提供父指针的话,应当如何有效的实现RB-INSERT。

  解:方法比较笨……如果不提供父指针的话,为旋转造成了麻烦。假设插入的节点是x,可以保存从根节点到x的所有节点的指针,这样就可以获得x的祖先的指针了。

 

 13-1 持久动态集合

  解:a) insert: 插入关键字后,从根节点到k的所有节点都要变化。delete: 如果y仅有一个孩子,则y的所有祖先节点都要改变;如果y有两个孩子,其后继是z,则y和z的所有祖先节点都要改变。

    b) 略

    c) O(h), O(h)

    d) 如果增加父节点域,则root的子节点所有父节点域都要改变,从而导致root的所有孩子节点都要复制,于是这些节点的孩子节点也要复制,……从而导致所有节点都要复制。时空要求为O(n)。

    e) 使用上题中的方法可在O(1)时间内获得所有节点的父节点。然后插入、删除时间复杂度和红黑树相同。

 

13-2 红黑树上的连接操作

  解:a) 黑高度增加的唯一方式是插入时黑色传到root且root原先为红色然后然后变为黑色。黑高度减少的唯一方式是额外的黑色传到root节点。因此可以在插入和删除过程中修改黑高度。当沿T下降时,遇到黑色顶点将黑高度减1即可得到各个节点的黑高度。

    b) 在T1 中从root开始沿着每个节点的右子树寻找黑高度为bh[T2]的黑节点y。

    c) parent[x] = y; left[x] = left[y]; right[x] = root[T2]

    d) x应着为红色。恢复性质2), 4)的情况同case2, case3。

    e) 略

    f) b), d)时间均为O(lgn),总时间为O(lgn)。

 

13-4 Treap

  解:a) 对于关键字各不相同的二叉树,插入顺序决定树的形状。当优先级确定时,插入顺序确定,树的形状确定。

    b) 随机构造的二叉查找树的期望高度是Θ(lgn),由于优先级随机确定,所有二叉树的随机构造的。

    c) 略

    d) 插入关键字的时间为Θ(lgn),为恢复最小堆的性质需要做旋转,旋转次数不超过树的高度Θ(lgn)。总体时间为Θ(lgn)。

    e) C:左旋转的次数; D:右旋转的次数

    f) 略

    g) 假设k > i,则[i, k] 共有k - i + 1 个元素,优先级有(k-i+1)!种情况。z的取值为[i+1, k-1],共k-i-1中取值。若要满足f)中条件,则x的优先级最低,y优先级高于所有z,即它们的优先级是确定的,剩余元素的优先级共有(k-i-1)!中情况。所以有Pr(Xi,k) = (k-i-1)!/(k-i+1)!。

    h) 令j = k - i, 1/j(j+1) = 1/j - 1/(j+1)。

    i) 略

    j) E(C) + E(D) = 1 - 1/k + 1 - 1/(n-k+1) < 2