zoukankan      html  css  js  c++  java
  • cs61b lab11

    实现BinarySearchTree,感觉比前面的2,3,4Tree要简单很多。

    part1实现find:

    private BinaryTreeNode findHelper(Comparable key, BinaryTreeNode node) {
        BinaryTreeNode newnode=node;
        if(key.compareTo(node.entry.key)==0)
            return node;
        else if(key.compareTo(node.entry.key)<0){
            if(node.leftChild==null)
                return null;
            else
                return(findHelper(key,node.leftChild));
        }
        else if(key.compareTo(node.entry.key)>0){
            if(node.rightChild==null)
                return null;
            else
                return(findHelper(key,node.rightChild));
        }
        else
            return null;
      }
    View Code

    part2:实现remove,分为无child,有一个child,有两个child的情况,注意root的特殊性,root无parent,要特殊处理,之前也碰到过因为没考虑root原因产生的bug。

    代码:

     1 public Entry remove(Object key) {
     2     BinaryTreeNode node=findHelper((Comparable)key,root);
     3     if(node==null)
     4         return null;
     5     else{
     6         Entry e=new Entry(node.entry.key,node.entry.value);
     7         if(node.leftChild==null&&node.rightChild==null){
     8             if(node.parent==null)
     9                 root=null;
    10             else{if(node==node.parent.leftChild)
    11               node.parent.leftChild=null;
    12           else if(node==node.parent.rightChild)
    13               node.parent.rightChild=null;
    14             }
    15         }
    16         else if(node.leftChild!=null&&node.rightChild==null){
    17             if(node.parent==null){
    18                 node.leftChild.parent=null;
    19                 root=node.leftChild;
    20             }
    21             else{if(node.parent.leftChild==node){
    22             node.parent.leftChild=node.leftChild;
    23             node.leftChild.parent=node.parent;}
    24             else if(node.parent.rightChild==node){
    25                 node.parent.rightChild=node.leftChild;
    26                 node.leftChild.parent=node.parent;
    27             }
    28             }
    29         }
    30         else if(node.leftChild==null&&node.rightChild!=null){
    31             if(node.parent==null){
    32                 node.rightChild.parent=null;
    33                 root=node.rightChild;
    34             }
    35             else{
    36             if(node==node.parent.rightChild)
    37             node.parent.rightChild=node.rightChild;
    38             else if(node==node.parent.leftChild)
    39                 node.parent.leftChild=node.rightChild;
    40             node.rightChild.parent=node.parent;
    41         }
    42         }
    43         else if(node.leftChild!=null&&node.rightChild!=null){
    44             BinaryTreeNode newnode=node.rightChild;
    45             while(newnode.leftChild!=null)
    46                 newnode=newnode.leftChild;
    47             node.entry=new Entry(newnode.entry.key,newnode.entry.value);
    48             if(newnode.rightChild==null){
    49                 if(newnode==newnode.parent.leftChild)
    50                     newnode.parent.leftChild=null;
    51                 else if(newnode==newnode.parent.rightChild)
    52                     newnode.parent.rightChild=null;
    53             }
    54             else if(newnode.rightChild!=null){
    55                 if(newnode==newnode.parent.leftChild)
    56                     newnode.parent.leftChild=newnode.rightChild;
    57                 else if(newnode==newnode.parent.rightChild)
    58                     newnode.parent.rightChild=newnode.rightChild;
    59                 newnode.rightChild.parent=newnode.parent;
    60                     
    61             }
    62         }
    63         size--;
    64         return e;
    65     }
    66   }
    View Code

    运行结果:

    Inserting 1A, 6V, 3K, 2Z, 5L, 9L:
    The tree is:  1A(((2Z)3K(5L))6V(9L))
    Size:  6
    
    Testing find() ...
    Calling find() on 1
      returned A.
    Calling find() on 9
      returned L.
    Calling find() on 5
      returned L.
    Calling find() on 4
      returned null.
    Calling find() on 6
      returned V.
    Calling find() on 3
      returned K.
    
    Testing remove() (for nodes with < 2 children) ...
    After remove(5):  1A(((2Z)3K)6V(9L))
    After remove(3):  1A((2Z)6V(9L))
    After remove(1):  (2Z)6V(9L)
    After inserting 7S, 8X, 10B:  (2Z)6V((7S(8X))9L(10B))
    Size:  6
    
    Testing remove() (for nodes with 2 children) ...
    After remove(6):  (2Z)7S((8X)9L(10B))
    After remove(9):  (2Z)7S((8X)10B)
    Size:  4
  • 相关阅读:
    sshd
    eclipse运行报java.lang.OutOfMemoryError: PermGen space解决方法
    项目之间依赖
    shell-
    部署记录
    mysql index使用
    GitHub上搭建私人hexo博客操作教程
    关于Vue实例的生命周期(2)
    JS中的五种去重方法
    Vue入门教程(2)
  • 原文地址:https://www.cnblogs.com/lyz1995/p/7256931.html
Copyright © 2011-2022 走看看