2016-04-28 9 views
0

タイトルにはバイナリツリーで最大値を見つけるのに役立つと書かれています。私は再帰でそれをしようとしています。binarytreeで最大値を見つけてそのノードを返します

ノードのインスタンス変数は、ノード内の要素がツリー内で重複していて、到達しようとしている最大値ですが、nullpointerexceptionを取得した場合に更新されます。これは私のコードです:

private Node getMaxFreq(Node node){ 
    Node left = null; 
    Node right = null; 
    if(node == null){ 
     System.out.println("tree is empty"); 
    } 
    if(node.compareTo(node.left) <= 0){ 
     getMaxFreq(node.left); 
    } 
    else{ 
     left = node; 
    } 
    if(node.compareTo(node.right) <= 0){ 
     getMaxFreq(node.right); 
    } 
    else{ 
     right = node; 
    } 

    if(left.compareTo(right) > 0){ 
     return left; 
    } 
    else{ 
     return right; 
    } 


} 
/** 
* method to find the node with highest frequency in tree. 
* @return node with highest frequency. 
*/ 
public void getMaxFreq(){ 
    Node temp = root; 
    System.out.println(getMaxFreq(temp)); 
} 

//Node class 
public class Node implements Comparable<Node> { 
    String word; 
    int freq; 
    Node left; 
    Node right; 

    Node(String word) { 
     this.word = word; 
     freq = 1; 

    } 

    public String toString() { 
     return word + " occurs " + freq + " times."; 
    } 


    public int compareTo(Node other) { 

     return Integer.compare(this.freq, other.freq); 
    } 

} 

私を助けてください!

+0

Nodeクラスも投稿できますか? –

+0

updated @ user3747720 – JohnBanana

答えて

0

returnの文をgetMaxFreq(node.left);とそのような場所の前に追加します。私はあなたのコードを正確に理解していませんが、あなたは再帰呼び出しの結果を決して使用しません。多分あなたは変数としてそれらを保存し、それらをお互いに比較すべきです。

0

leftrightを使用する前に、nullをチェックしていません。最終的には、左または右、またはどちらも持たないノードに実行されます。あなたは左/右がヌルであることを確認する必要があります - 明らかに - そこにノードが存在しないので、そのようなノードを調べたり移動したりする必要はありません。

+0

もう少し評価できますか?私はすべてここにこだわっています。 – JohnBanana

+0

@JohnBananaいいえ、できません。これはあなたが必要とするものです:オブジェクト参照を使用する前に、例えば 'if(left.compareTo(right)> 0)'の行のように{' - あなたは**'あなたが得ている非常に例外をスローします。 – MichaelK