考虑以下代表二叉树节点的类。
public class BinaryTreeNode {
private int key;
private BinaryTreeNode left;
private BinaryTreeNode right;
public BinaryTreeNode(int key) {
this.key = key;
this.left = null;
this.right = null;
}
public BinaryTreeNode(int key, BinaryTreeNode left, BinaryTreeNode right) {
this.key = key;
this.setLeft(left);;
this.setRight(right);
}
}
现在,据我所知,在构造函数
BinaryTreeNode(int key, BinaryTreeNode left, BinaryTreeNode right)
中,直接设置左/右节点是一个坏主意,不应完成。一种可能的方法是使用clone()
创建副本并将其设置为left
/ right
。但这将是一个浅表副本,并且会产生问题,因为BinaryTreeNode
也具有非原始字段,即BinaryTreeNode
本身。因此,现在我被困在如何在这种情况下创建复制构造函数?任何线索都会有所帮助。
最佳答案
认为这取决于您将如何使用此结构。可能的方式:
如果单线程应用程序将填充结构并使用它,则保持原样。
使字段成为最终字段(使BinaryTreeNode
变为不可变),并更改设置程序以返回具有新的右/左的新实例(这样就避免了重复和并发修改),可以在多线程环境中使用。
克隆结构?在某些情况下可能还可以。您需要实现克隆本身并分配克隆的副本(在构造函数和setter中),但是我要说的是,您需要再次将字段标记为final,并且使用这种简单的结构,您会得到第2种情况,其中包含了额外的克隆开销。