この問題の混乱は、Java でオブジェクトがどのように渡されるかを理解していないことに帰着します。
以下のコードに示すように updateNodeData を使用すると、参照のコピーを値渡しで最初の引数として渡します。次に、そのノードのデータが変更されます (データがpublicであると仮定します)。
同様に、nodeToBeChanged の leftNode も、newLeftNode で渡されたものと同じノードを参照するようになりました。コピーされた値を持つ新しいノードは複製/作成されません。
public void updateNodeData(Node node, int newValue){
node.data = newValue;
}
public void setLeftNode(Node nodeToBeChanged, Node newLeftNode)
{
nodeToBeChanged.leftNode = newLeftNode;
}
ただし、よく混乱するのは、値によって渡される参照のコピーであるため、以下に示すように 2 つのノードのスワップを実行できないことです。実際の参照ではなく、コピーを交換します。
public void swap(Node node1, Node node2)
{
Node tmpNode = node1;
arg1 = arg2;
arg2 = tmpNode;
}
ここで元の質問に戻ります。ノード ツリーが次のようなノードで実装される場合:
public class Node {
private int data;
private Node left;
private Node right;
...
}
あちこちに同じノードの異なるクローンがあり、メモリを浪費することはありません。ノードと参照の長いチェーンになります。