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;
  }

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   }

运行结果:

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
时间: 2024-10-12 17:57:34

cs61b lab11的相关文章

CS61b homework1

Programe1:根据输入建立URL,读取其网站前五行内容并输出,代码: import java.io.*;import java.net.URL;public class programe1{ public static String reverse(String s){ int len=s.length(); StringBuffer sb=new StringBuffer(len); for(int i=(len-1);i>=0;i--){ sb.append(s.charAt(i));

CS61b lab1代码实现及运行结果

task1:程序是已经给好的,放到编译器里找出了几处错误就能运行了,运行结果如图: task2:不知道它这个lab中说的EMAC是什么,只能在eclipese上简单的写了个排序的程序,任务的要求是根据surname排序,不过鉴于surnname是先出现的,简化起见就 没有区分surnname和Given Name,把两个合在一个String里一起排序了.代码如下: import java.io.*;import java.util.ArrayList;import java.util.Array

CS61b lab3 分享一个bug,足足找了一个多小时,希望各位别入坑哈

part1: 写一个测试程序,比较简单就不贴代码啦,运行结果: part2: 改进InserEnd method,我是按照课上讲的把原来的singlyList变成doubleList,在SListNode中多加入一个prev变量,修改后SListNode: class SListNode { Object item; SListNode next; SListNode prev; SListNode(Object obj) { item = obj; next = null; prev=null

CS61b lab5

part1:父类reference可以指向子类的Object,但子类reference不能指向父类Object,因为子类可能存在更多的method和filed. part2:(a)可以(b,c)不行 (d)可以 interface和superclass的method名称相同,若返回类型和接受参数类型均相同,则不产生歧义可以通过编译,否则则不能通过编译. part3: 接口和父类中的constant会产生歧义,在子类中使用可标明class类型: package lab; class a{ publ

CS61b homework2 打卡

主要考点:String类matches和split方法的运用,正则表达式的运用. 判断闰年,计算天数等算法.代码如下: import java.io.*; public class Date { private int month; private int day; private int year; public Date(int month, int day, int year) { if(!isValidDate(month,day,year)) System.exit(0); this.

cs61b lab10

运行结果: Creating 2-node tree. Testing parent(). Testing insertChild(). Adding two more nodes to the 2-node tree. Adding two more nodes to the 4-node tree. 1132 2131 The tree looks like this: 1 11 12 13 131 132 [The above sequence should be 1, 11, 12, 1

CS61b homework5

hw5相比hw4,修改了以下的bug,从而更好的实现了对代码的封装: 1:hw4中,remove(n)时,若n不存在于本list却存在于其他list中,会remove其他list中的node,同时减少本list的size. 2:hw5中,listnode本身含有其所包含的list的field,因此可将insertAfter()等方法移到listnode中实现. 3:hw4中,如果在remove(n)后实现insertAfter(n),由于remove后n依然存在,会产生插入的错误. 4:hw4中

cs61b homework4

作业中没给测试代码,测试代码是从一亩三分地论坛上盗的别人的. 运行结果: DList: LockDList: 因为List之前的homework和project中已经实现过好几回了,所以感觉这次作业还比较轻松,没有怎么debug就出来了: 贴一下LockDList的代码好了: LockDListNode: package list; public class LockDListNode extends DListNode { boolean isLocked; LockDListNode(Obj

CS 61B lab11

测试结果: private BinaryTreeNode findHelper(Comparable key, BinaryTreeNode node) { // Replace the following line with your solution. BinaryTreeNode movingnode = node; while(movingnode!=null){ if(key.compareTo((Comparable)(movingnode.entry.key))>0){ movin