2016-11-15 13 views
0

クラスIでは、ノードを追加/削除し、すべてのノードを特別な方法で出力することができるAVLTreeを作成することになりました。私はこれを達成した。 Eveyrthingはローカルコンピュータで正常に動作します。しかし、コードをオンライン提出サーバーにアップロードし、コマンドライン入力でそれをテストすると、私の機能の1つが機能しなくなり、誰かが理由を説明できると思っていました。ここで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; 
      } 

     } 
    } 


} 

コマンドライン入力のために使用していますメインは2で異なる第二のmainメソッドがあるから私はコンピュータ上でコマンドラインを使用していないので、コンピュータのバージョンに入力ファイルをコピーし、手動ですべてを入力しました。ここ

最後に、ここで入力ファイル

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のバージョンの違いのがわかりました。

は、我々は単にbinarySearch()方法で

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

if (name == node.name)

を変更