2016-05-18 3 views
0

私はカスタムバイナリ検索ツリークラスを作成しています。何らかの理由でノードに割り当てられた値が常に失われます。ここに私の方法です。バイナリ検索ツリーaddメソッド参照が失われる

private void add(TreeNode node, int a) { 
    if(node==null) { 
     System.out.println("node=null"); 
     node = new TreeNode(a); 

    }else { 
     if(a<node.value) { 
      System.out.println("root > value "+"root: "+node.value+"value: "+a); 

      add(node.left, a); 

     }else { 

      System.out.println("root < value "+"root: "+node.value+"value: "+a); 

      add(node.right, a); 

     } 
    } 
} 

//root is class data 
public void add(int a) { 
    add(root, a); 
} 

私はこれを実行すると、ステートメントは値が実際に私のノードに割り当てることはありませんを意味し、falseをチェックしたことがない場合は、コンソール画面には常に、最初のノード= NULLを出力します。私は参照がどこかで失われたと思うが、私はどこがわからない。私が見

+0

node.left/rightを渡して、それがnullの場合、コードは左/右ノードを実際に作成していない参照に新しい値を割り当てます。完全なクラスコードを貼り付けます。これは、あなたが何をする必要があるかを伝えるのに役立ちます。 –

+0

'root'を宣言/初期化するコードは含まれていません。それがなぜヌルであるかをどのように知るべきですか? – shmosel

答えて

1

問題:

  1. 必要な場合は、あなたがリンクされたコードに根を初期化されていません。新しいノードを作成していますが、必要に応じてルートを設定することはありません。 (ヒント:最初の挿入にはルートを設定する必要があります!)
  2. node.left/node.rightを渡すとき、あなたは新しい左/必要であれば右の子ノード

if(a < node.value){ 
    if(node.left == null){ 
     //set the new left node 
     node.left = new TreeNode(a); //STOP CONDITION! 
    }else{ 
     add(node.left, a);   //Recurse left down the BST! 
    } 
} 

再帰を使用しているため、適切な停止条件が必要です。あなたのコードはある時点で停止しますが、実際にはあなたが望むことはしていません。正確さのために、新しい子ノード参照を設定していることを確認する必要があります(コードの上にヒントがあります)。左に再帰するときは、最終的に新しいリーフノードを作成する必要があるまで、新しい値をBSTに伝播しています。同様のことは、ツリーのすぐ下を再帰するときに起こるはずです。

あなたのケースでは、ヌルに達するまで左右のノード値を渡すだけで、子ノードの参照を更新することはありません。

関連する問題