二分木をいじっていたところ、なぜ最初の実装は機能したのに 2 番目の実装は機能しなかったのか興味がありました。私は何を見落としていますか?些細なことだと思いますが、まだ見逃しています。
1:
//just a wrapper around the insertTree method.
public void insertKey(int key){
if(root==null) //a private 'Node' variable.
root = new Node(key);
else
insertTree(key, root);
}
//recursive insert - working
private void insertTree(int key, Node node)
{
if(key <= node.getKey())
{
if(node.left!=null)
insertTree(key, node.left);
else
node.left = new Node(key); //explicitly setting left child
}
else
{
if(node.right!=null)
insertTree(key, node.right);
else
node.right = new Node(key); //explicitly setting right child
}
}
機能していないバリアント:
2:
private void insertTree(int key, Node node)
{ //if node is null, create a new node. Can be either node.left or node.right
if(node==null)
{
node = new Node(key);
return;
}
else
if(key <= node.getKey())
insertTree(key, node.left);
else
insertTree(key, node.right);
}
left, right
ノードは、パブリックメンバーと 1 つのint key
データ メンバーを持つ単純なクラスです。派手なものはありません。そのため、#1 は問題なく機能し、inorder traversal によってソートされた出力が生成されます。現在、#2は機能していないようです。ルートは初期化される唯一のものであり、その左/右の子は引き続き null です。では、パラメーターとして渡す場合node.left
、再帰的なメソッド呼び出しで新しいノードが割り当てられないのはなぜですか? ここで何が欠けていますか?Java は参照渡し (つまり、参照の値) であるため、これでうまくいくと思いますが、ここでちょっとしたことを見逃しているのかもしれません。