您的位置:首页 > 其它

[算法导论 12章练习答案] 12.2 12.3

2012-11-29 10:38 218 查看
12.3

12.3

//12.3-1
TREE-INSERT(T,z)
if root[T]=NIL
root[t]=z
return;
x=root[T]
if key(z)<key[x]
TREE-INSERT(left[T],z) // here left[T] is a pointer to a tree, for we may modify the content of the tree
else
TREE-INSERT(right[T],z)

//12.3-2
// 论证:为在树中查找一个key,所检查的节点数等于插入该key时所检查的结点数+1
// 论证过程:假设插入该key时检查的结点路径是n0n1n2...nk,则查找该key时的路径也一定是n0n1...nk,不可能有第二条路径。
// 再加上该key结点,因此总共要检查k+1个节点数

//12.3-3
/*
最好情况是:nlgn
最坏情况: n2
*/

//12.3-4 另外有一种数据结构包含指向BST某结点y的指针。用过程tree-delete删除y的前趋z,这样做会出现什么问题.如何改写tree-delete来解决这些问题
/*
会出现问题:y的指针失效
改写方法:tree-delete中,除了被删除结点的指针,其他结点的指针不变
*/
// original version
TREE-DELETE(T,z)
if(left[z]=NIL or right[z]=NIL)
y=z
else
y=TREE-SUCCESSOR(z) // y is the node to be delete. and y should have at most one child. Can we use TREE-PREDECESSOR?
if left[y]!=NIL
x=left[y]
else
x=right[y]
if x!=NIL
p[x]=p[y]
if p[y]==NIL  // the tree is empty
root[T]=x
else
if y=left[p[y]]
left[p[y]]=x
else
right[p[y]]=x
if y!=z
key[z]=key[y]
// and copy the satellite data from y to z
return y

// modified version
TREE-DELETE(T,z)
if(left[z]=NIL or right[z]=NIL)
y=z
else
y=TREE-SUCCESSOR(z) // y is the node to be delete. and y should have at most one child. Can we use TREE-PREDECESSOR?
if left[y]!=NIL
x=left[y]
else
x=right[y]
if x!=NIL
p[x]=p[y]

// 已经删除了要删除的结点
if p[y]==NIL  // the tree is empty
root[T]=x
else
if y=left[p[y]]
left[p[y]]=x
else
right[p[y]]=x

if y!=z
left[y]=left[z]
right[y]=right[z]
if z=left[p[z]]
left[p[z]]=y
else
right[p[z]]=y
return y

//12.3-6
//修改策略:如何选择前趋或后继结点作为被拼接的结点,使得有更好的经验性能
//假设被删除的结点是z,有两个子节点。其前趋是p,后继是s。则一定有h(z)<h(p),h(z)<h(s)
// 从p、s中选择高度较大的结点作为被拼接的结点。这样可减少z的两棵子树的高度差,使得树更加平衡
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: