考虑以下代表二叉树节点的类。

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种情况,其中包含了额外的克隆开销。

09-28 05:11