2011-03-24 38 views
1

こんにちは、私は現在、私のプロジェクト(アルゴリズム可視化ツール)のテスト段階を行っています。私は私のBSTのdeleteメソッドに問題が発生しています。バイナリ検索ツリーJavaでの可視化

public boolean delete(String key) { 
boolean deleted = true; 
boolean finished=false; 
BNode current = root; 
BNode prev = null; 
while (!finished) { 
    if (key.compareTo(current.key) > 0) { 
    prev = current; 
    current = current.right; 
    this.repaint(); 
    } 
    else if (key.compareTo(current.key) < 0) { 
    prev = current; 
    current = current.left; 
    this.repaint(); 
    } 
    else if (key.compareTo(current.key) == 0) { 
     finished=true; 
     this.repaint(); 
    } 

} 

if (check(current) == 0) { 
    if(current==root) 
    { 
     root=null; 
     xPos=400; 
     yPos=60; 
     this.repaint(); 
    } 
    else 
    { 
     if (current.key.compareTo(prev.key) > 0) { 
      prev.right = null; 
      this.repaint(); 
     } 
     else if(current.key.compareTo(prev.key) < 0) { 
      prev.left = null; 
      this.repaint(); 
     } 
    } 

} 
else if (check(current) == 1) { 
    if(current==root) 
    { 
     prev=current; 
     if (current.left != null) { 
      current=current.left; 
      prev.key=current.key; 
      prev.left = current.left; 
      this.repaint(); 
     } 
     else { 
      current=current.right; 
      prev.key=current.key; 
      prev.right = current.right; 
      this.repaint(); 
     } 
    } 
    else 
    { 

    if (current.key.compareTo(prev.key) > 0) { 
    if (current.left != null) { 
     prev.right = current.left; 
     this.repaint(); 
    } 
    else { 
     prev.right = current.right; 
     this.repaint(); 
    } 
    } 
    else if(current.key.compareTo(prev.key) < 0) { 
    if (current.left != null) { 
     prev.left = current.left; 
     this.repaint(); 
    } 
    else { 
     prev.left = current.right; 
     this.repaint(); 
    } 
    } 
    } 
} 
else if (check(current) == 2) { 
    BNode temp = inord(current); 
    if(current==root) 
    { 
     root.key=temp.key; 
     this.repaint(); 
    } 
    else 
    { 

     if (current.key.compareTo(prev.key) > 0) { 
     prev.right.key = temp.key; 
     this.repaint(); 
    } 
    else { 
     prev.left.key = temp.key; 
     this.repaint(0); 
    } 
    } 
} 

return deleted;} 

BSTクラス自体のコードはかなり長くなっています。私が子供を持たないノードを削除しようとすると、例9と10を入力(del 10を試してみる)または5と12(del 12を試してみてください)を使用するとnullpointer例外が発生しますが、私は例えば4と8のユーザー(デル8にしようとする)または9、6と5の場合。私は問題がcompareToであると思う。

int check(BNode a) { 
int ret; 
if ((a.left != null) && (a.right != null)) { 
    ret = 2; 
} 
else if ((a.left == null) && (a.right == null)) { 
    ret = 0; 
} 
else { 
    ret = 1; 
} 
return ret;} 
私は本当に必要であれば、クラス全体を投稿することができますthis.Iで助けを必要と

.. はありがとうございました!

+3

NPEのスタックトレースを投稿できますか? – Thomas

+0

視覚化は関係していませんか?次に、投稿のタイトルを変更する必要があります。なぜなら、人々はある視覚化の質問に尋ねることを期待しているからです。 –

答えて

0

ちょうど少数のノート:

  1. あなたがチェックする場合はnullを渡すと、あなたがそこにNPEを取得したいです。
  2. if(check(current) == 0)など - >あなたは一度チェックし、2:

    int result = check(current); 
    switch(result) { 
        case 0: 
        //do whatever is appropriate 
        break; 
        case 1: 
        //do whatever is appropriate 
        break; 
        case 2: 
        //do whatever is appropriate 
        break; 
        default: 
        //should never happen, either leave it or throw an exception if it ever happens 
    } 
    

    編集のためであれば(あるいはスイッチ)

例を実行してください://実際には、この編集を忘れます、ちょうどこれが起こるべきではありません見て、それはまだ

あなたはまた、あなたのコードでは、このようなものを持って良いスタイルではありません。

if (current.left != null) { 
    current=current.left; 
    prev.key=current.key; 
    prev.left = current.left; 
    this.repaint(); 
} 
else { 
    current=current.right; //this might be null 
... 
} 

current.leftがnullでcurrent.rightがnullの場合、currentはnullになります。

+0

実際に5と18を入力して削除したい場合は、18を選択します。現在のルートはrootとなり、prevはnullを指します。したがって、18.compareTo(5)> 0はルートノードを指し、18を含むノードへの現在の点を指し、18.compareTo(18)はループを終了させます。チェック(現在)はNPEを与えてはいけません。しかしそれはそうです。私が7と8を入力して8を削除すると正常に動作します。 – user630167

+0

スタックトレースを投稿してください。さらに、最初のwhileループの後に、 'current'が実際にはnullでないかどうかをデバッグして調べたいかもしれません。 – Thomas

+0

私はちょうどintに属性キーの型を変更し、どこでも整数を比較しました。今はすべて正常に動作しています。どこかで間違いがあったはずです。君たちありがとう.. – user630167