zoukankan      html  css  js  c++  java
  • [算法导论 12章练习答案] 12.2 12.3

    12.3

    12.3
     1 //12.3-1
     2 TREE-INSERT(T,z)
     3     if root[T]=NIL
     4         root[t]=z
     5         return;
     6     x=root[T]
     7     if key(z)<key[x]
     8         TREE-INSERT(left[T],z) // here left[T] is a pointer to a tree, for we may modify the content of the tree
     9     else
    10         TREE-INSERT(right[T],z)
    11 
    12 //12.3-2
    13 // 论证:为在树中查找一个key,所检查的节点数等于插入该key时所检查的结点数+1
    14 // 论证过程:假设插入该key时检查的结点路径是n0n1n2...nk,则查找该key时的路径也一定是n0n1...nk,不可能有第二条路径。
    15 // 再加上该key结点,因此总共要检查k+1个节点数
    16 
    17 //12.3-3
    18 /*
    19     最好情况是:nlgn
    20     最坏情况: n2
    21 */
    22 
    23 //12.3-4 另外有一种数据结构包含指向BST某结点y的指针。用过程tree-delete删除y的前趋z,这样做会出现什么问题.如何改写tree-delete来解决这些问题
    24 /*
    25     会出现问题:y的指针失效
    26     改写方法:tree-delete中,除了被删除结点的指针,其他结点的指针不变
    27 */
    28 // original version
    29 TREE-DELETE(T,z)
    30     if(left[z]=NIL or right[z]=NIL)
    31         y=z
    32     else
    33         y=TREE-SUCCESSOR(z) // y is the node to be delete. and y should have at most one child. Can we use TREE-PREDECESSOR?
    34     if left[y]!=NIL
    35         x=left[y]
    36     else
    37         x=right[y]
    38     if x!=NIL
    39         p[x]=p[y]
    40     if p[y]==NIL  // the tree is empty
    41         root[T]=x
    42     else 
    43         if y=left[p[y]]
    44             left[p[y]]=x
    45         else
    46             right[p[y]]=x
    47     if y!=z
    48         key[z]=key[y]
    49         // and copy the satellite data from y to z
    50     return y
    51     
    52 // modified version
    53 TREE-DELETE(T,z)
    54     if(left[z]=NIL or right[z]=NIL)
    55         y=z
    56     else
    57         y=TREE-SUCCESSOR(z) // y is the node to be delete. and y should have at most one child. Can we use TREE-PREDECESSOR?
    58     if left[y]!=NIL
    59         x=left[y]
    60     else
    61         x=right[y]
    62     if x!=NIL
    63         p[x]=p[y]
    64     
    65     // 已经删除了要删除的结点
    66     if p[y]==NIL  // the tree is empty
    67         root[T]=x
    68     else 
    69         if y=left[p[y]]
    70             left[p[y]]=x
    71         else
    72             right[p[y]]=x
    73             
    74     if y!=z
    75         left[y]=left[z]
    76         right[y]=right[z]
    77         if z=left[p[z]]
    78             left[p[z]]=y
    79         else
    80             right[p[z]]=y
    81     return y
    82     
    83 //12.3-6
    84 //修改策略:如何选择前趋或后继结点作为被拼接的结点,使得有更好的经验性能
    85 //假设被删除的结点是z,有两个子节点。其前趋是p,后继是s。则一定有h(z)<h(p),h(z)<h(s)
    86 // 从p、s中选择高度较大的结点作为被拼接的结点。这样可减少z的两棵子树的高度差,使得树更加平衡
  • 相关阅读:
    Javascript:window.close()不起作用?
    为什么全部width:100%浏览器边缘存在留白?
    hello world
    【Vue】在Vue事件中是如何使用event对象的?
    【Vue】特殊属性is
    【Vue】过滤器
    【Vue源码】Vue不能检测到对象属性的添加或删除
    【VueRouter】vue路由跳转打开新窗口
    【VueRouter】切换路由后,新页面滚动到顶部或保持原先的滚动位置——scrollBehavior
    【VueRouter】前端路由的两种模式
  • 原文地址:https://www.cnblogs.com/chenhuanfa/p/2794134.html
Copyright © 2011-2022 走看看