使用可序列化但仍然变浅的对象副本

时间:2014-03-21 17:16:18

标签: java tree deep-copy

我浏览了其他问题,并找到了如何对包含引用的对象进行深层复制的解决方案。我特别想要制作一张树的深层副本。逻辑上,每个树节点都包含对其子节点的引用。以下是我的节点类

的基础知识
public class BSTNode implements Comparable, Serializable  {

    private String token;
    private int count;
    private BSTNode leftChild;
    private BSTNode rightChild; 

我知道我只能做一个浅拷贝,因为当我复制tree1,称为tree2,编辑tree1时,编辑也出现在tree2上。这是我的BSTNode

中的复制方法
public  BSTNode copy()
   {
   BSTNode obj = null;
   try{
       ByteArrayOutputStream bos = new ByteArrayOutputStream();
       ObjectOutputStream out = new ObjectOutputStream(bos);
       out.writeObject(this);
       out.flush();
       out.close();

       ObjectInputStream in= new ObjectInputStream(new ByteArrayInputStream(
               bos.toByteArray()));
       obj = (BSTNode) in.readObject();
   }
   catch(Exception e)
   {
       e.printStackTrace();
   }
   return obj;
 } 

当我希望复制整个树时,我使用下面的方法从我的BSTree类中调用上面的复制方法。 (我有两种方法,因为这是一个家庭作业,需要一个调用前序遍历方法的复制方法)

  public BSTNode copy()
{
    BSTNode copiedTreeRoot = new BSTNode();
    return copyTree(copiedTreeRoot,root);
}

public BSTNode copyTree(BSTNode copiedTreeRoot, BSTNode otherTreeRoot)
{
    if(otherTreeRoot == null)
    {
        copiedTreeRoot = null;
    }
    else
    {
         copiedTreeRoot = otherTreeRoot.copy();
         copyTree(copiedTreeRoot.getLeft(), otherTreeRoot.getLeft());
        copyTree(copiedTreeRoot.getRight(), otherTreeRoot.getRight());          
    }
    return copiedTreeRoot;
}

我使用这些行来创建新树并将副本分配给它

BSTree tree2 = new BSTree();
tree2.setRoot(tree1.copy());

当我对tree1进行更改时,树2也会发生变化。我不知道我做错了什么。我相信它必须在我如何归还新树或某物的某处。非常感谢任何帮助!!

修改的 这是我最初称之为副本的地方。它本身就是一个主要方法      tree2.setRoot(tree1.copy());

然后移动到BSTree class并执行此

public BSTNode copy()
{
    //BSTNode copiedTreeRoot = new BSTNode();
   //return copyTree(copiedTreeRoot,root);
    return root.copyTree(root
}

BSTree类有一个根的成员元素,名为root 然后它会跳转到BSTNode类并执行此

 public BSTNode copyTree(BSTNode input)
{
   if(input == null)
   {
       return null;
   }
   else
   {
       BSTNode node = new BSTNode();
       node.token = input.token;
       node.count = input.count;
       node.leftChild = copyTree(input.leftChild);

       node.rightChild = copyTree(input.rightChild);
       System.out.println("node being returned: "+ node.getToken());
       return node;    
   }

}

当我打印新树的输出时,我得到一个空白。

1 个答案:

答案 0 :(得分:0)

     public class BSTNode
{
public String token;
public int count;

public BSTNode leftChild;
public BSTNode rightChild;


public static BSTNode copyTree(BSTNode input){
if(input == null){
return null;
}
else{
BSTNode node = new BSTNode();
node.token = input.token;
node.count = input.count;

node.leftChild = BSTNode.copyTree(input.leftChild);
node.rightChild = BSTNode.copyTree(input.rightChild);
return node;

}

}

public static void main(String args[]){
BSTNode root = new BSTNode();
root.token  = "root";
root.count = 1;

BSTNode leftChild  = new BSTNode();;
leftChild.token  = "left child";
leftChild.count = 2;

root.leftChild = leftChild;

BSTNode copy = copyTree(root);
System.out.println(copy.token);
System.out.println(copy.leftChild.token);

}
}