算法导论-红黑树习题解
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