考虑以下表示二叉树节点的类。
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
本身。那么现在我被困在如何在这种情况下创建一个复制构造函数?
任何领导都会有所帮助。
答案 0 :(得分:1)
认为这取决于您将如何使用此结构。可能的方法:
保持原样,如果单线程应用程序将填充结构而不是使用它。
使字段最终(因此BinaryTreeNode
变为不可变),并更改setter以便以新的右/左方式返回新实例(因此没有重复且没有并发修改),应该可以在多线程环境
克隆结构?某些情况可能还行。你需要实现克隆本身并分配克隆拷贝(在构造函数和setter中),但我会说你需要再次标记字段final和这样简单的结构,你将得到案例2克隆的额外开销。