我发现在这个问题上的混淆通常归结于不理解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;
}
然而,经常会让人感到困惑的是,由于它是按值传递引用的副本,所以无法像下面演示的那样交换两个节点。你将交换
副本而不是实际引用。
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;
...
}
同一个节点不会存在于不同的位置进行克隆,以此浪费内存。整个过程只是一条长链,由节点和引用构成。