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

 

posted @ 2017-07-29 17:45  想做码农的熊孩子  阅读(239)  评论(0编辑  收藏  举报