2016-11-15 166 views
0

因此,對於課堂,我負責創建一個AVLTree,它可以添加/刪除節點並以特殊方式打印所有節點。我完成了這個。 Eveyrthing在我的本地計算機上正常工作。但是,當我將代碼上傳到在線提交服務器並使用命令行輸入進行測試時,我的一個功能停止工作,我希望有人能解釋爲什麼。AVLTree節點刪除

這是我在我的電腦主要方法:

 AVLTree avl = new AVLTree(); 
     avl.insert(5, "earl"); 
     avl.insert(3, "colin"); 
     avl.insert(6, "fiona"); 
     avl.show(); 
     avl.insert(2, "bonnie"); 
     avl.insert(4, "danielle"); 
     avl.show(); 
     avl.insert(1, "alex"); 
     avl.show(); 
     avl.delete("bonnie"); 
     avl.delete("alex"); 
     avl.show(); 

這裏是第二主方法,我使用命令行輸入

public static void main(String[] args) throws FileNotFoundException{ 
     Scanner input = new Scanner(new File(args[0])); 
     String name = new String(); 
     int key = 0; 
     AVLTree avl = new AVLTree(); 
     while (input.hasNext()) { 
      String opt = input.next().toUpperCase(); 
      switch(opt) 
      { 
       case "INSERT": 
        name = input.next(); 
        key = input.nextInt(); 
        avl.insert(key, name); 
        break; 
       case "REMOVE": 
           name = input.next(); 
         System.out.println("***" + avl.search(name));//this is where the problem is. On the server it returns null, on my computer it returns the correct node 
        avl.delete(name); 
        break; 
       case "SHOW": 
          avl.show(); 
          break; 
      } 

     } 
    } 


} 

主要是在兩個不同的,因爲我沒有在我的計算機上使用命令行,所以我複製了計算機版本上的輸入文件並手動輸入了所有內容。

這裏是輸入文件

insert Earl 5 
insert Colin 3 
insert Fiona 6 
show 
insert Bonnie 2 
insert Danielle 4 
show 
insert Alex 1 
show 
remove Bonnie 
remove Alex 
show 

最後這裏有必要刪除節點的功能。

public boolean delete(String name) { 
     Node target = search(name); 
     if (target == null) return false; 
     target = deleteNode(target); 
     balanceTree(target.parent); 
     return true; 
    } 

    private Node deleteNode(Node target) { 
     if (isLeaf(target)) { //leaf 
      if (isLeftChild(target)) { 
       target.parent.left = null; 
      } else { 
       target.parent.right = null; 
      } 
     } else if (target.left == null^target.right == null) { //exact 1 child 
      Node nonNullChild = target.left == null ? target.right : target.left; 
      if (isLeftChild(target)) { 
       target.parent.setLeftChild(nonNullChild); 
      } else { 
       target.parent.setRightChild(nonNullChild); 
      } 
     } else {//2 children 
      Node immediatePredInOrder = immediatePredInOrder(target); 
      target.value = immediatePredInOrder.value; 
      target = deleteNode(immediatePredInOrder); 
     } 

     reHeight(target.parent); 
     return target; 
    } 
    public Node search(String name) { 
     return binarySearch(root, name); 
    } 
    private Node binarySearch(Node node, String name) { 
     if (node == null) 
     return null; 
     if (name == node.name) 
      return node; 
     else { 
      Node foundNode = binarySearch(node.left, name); 
      if(foundNode == null) { 
       foundNode = binarySearch(node.right, name); 
      } 
      return foundNode; 

     } 

    } 

問題是,搜索功能找不到服務器版本上的節點,我找不出原因。

而且,這裏是輸出

Local Version 
    earl 5 
     colin 3 
     fiona 6 
    earl 5 
     colin 3 
      bonnie 2 
      danielle 4 
     fiona 6 
    colin 3 
     bonnie 2 
      alex 1 
     earl 5 
      danielle 4 
      fiona 6 
    ***bonnie 2//the println statement for search 

    earl 5 
     colin 3 

Server Version 

Earl 5 
    Colin 3 
    Fiona 6 
Earl 5 
    Colin 3 
     Bonnie 2 
     Danielle 4 
    Fiona 6 
Colin 3 
    Bonnie 2 
     Alex 1 
    Earl 5 
     Danielle 4 
     Fiona 6 
***null//search println 
***null//search println 
Colin 3 
    Bonnie 2 
     Alex 1 
    Earl 5 
     Danielle 4 
     Fiona 6 

      danielle 4 
     fiona 6 

回答

0

我的教授,我能對這些發言,我們發現這個問題是因爲在Java的版本差異。

我們只是改變

if (name == node.name)

if (name.compareTo(node.name) == 0)

binarySearch()方法