2017-03-04 13 views
0

ノードに存在する値に基づいて特定のノードを検索するための一般的なバイナリヒープ(MaxHeap)を作成しました。私は、Pre-OrderTraversalを使用して検索機能を実行し、Order nの実行時間を与えるようにしました。ここで、nはヒープ内のノードの数です。私のコードは動作していないようです。 preOrderT関数に2番目の「else if」が存在することはありません。あなたはそれに何ができるのかを提案できますか?ヒープの検索機能

私のノードクラスは、整数キー(それに基づいてヒープが配置される)、一般的なオブジェクト値、および親のleftChildおよびrightChildへの参照を含むように定義されています。

public Node<E> search(E p){ 
    Node<E> N; 

    N= preOrderT(root, p); 
    return N; 
} 

public Node<E> preOrderT(Node<E> N, E p){ 
    Node<E> M=null; 

    if (N.value==p) M=N; 
    else if (M==null && N.leftChild!=null){ M=preOrderT(N.leftChild, p);} 
    else if (M==null && N.rightChild!=null){ M=preOrderT(N.rightChild, p);} 
    return M; 
} 
+0

'println'はあなたの友達です - 'のprintln( "N.value:" + N.value + "P:" + P);なぜそれ ' – rbellamy

答えて

2

問題がleftChildがある場合、その後、あなたはそれをrightChildをチェックする機会を与えることはありません。代わりに、leftChildの確認が完了したら、値が見つからない場合はrightChildにチェックを入れてください。以下のように

public Node<E> preOrderT(Node<E> N, E p){ 
Node<E> M=null; 

if (N.value==p) M=N; 
else 
{ 
    if (N.leftChild!=null){ M=preOrderT(N.leftChild, p);} 
    if (N.rightChild!=null){ M=preOrderT(N.rightChild, p);} 
} 
return M; 

}

+0

に何が起こっているか見るために私はまだ理解していません2番目の「else if」には入りません。最初のelse ifループにMのヌル値が与えられていれば、プログラムは2番目のelseに入りませんか? – Avi

+0

最初の 'else if'が成功した場合、' else if'の2番目のものは、最初の本体で何が起こっても実行されません。 – Jeremy

0

あなたはあなたとしての機能を更新する必要があります。

if (N.value==p) M=N; 
    else { 
     if (M==null && N.leftChild!=null){ M=preOrderT(N.leftChild, p);} 
     if (M==null && N.rightChild!=null){ M=preOrderT(N.rightChild, p);} 
} 
+0

ありがとう。私はこの問題に2時間拘束されていて、何が間違っていたのか理解できませんでした。私のコードは、私が提案した編集を行った後に機能します。 – Avi

+0

私はまだそれが2番目の「else if」に入っていない理由を理解していません。最初のelse ifループにMのヌル値が与えられていれば、プログラムは2番目のelseに入りませんか? – Avi

+0

'if'が実行されない場合にのみ 'else if'が実行されます。あなたのケースでは、このシナリオがありました: 'if'と 'else if'ともう一度 'else if'です。この3つのケースのうちの1つだけが実行されることがあります。あなたの場合、最後のelseは最初の2つの条件が満たされない場合にのみ実行されます。つまり、 "N.valueがpに等しくなく、" N.leftChildがnullに等しい "場合にのみ、3番目のelse if条件をチェックします。 –

0

変更:

+0

ありがとうございます。私はこの問題に2時間拘束されていて、何が間違っていたのか理解できませんでした。私のコードは、私が提案した編集を行った後に機能します。 – Avi

+0

私はまだそれが2番目の「else if」に入っていない理由をまだ理解していません。最初のelse ifループにMのヌル値が与えられていれば、プログラムは2番目のelseに入りませんか? – Avi