我浏览了其他问题,并找到了如何对包含引用的对象进行深层复制的解决方案。我特别想要制作一张树的深层副本。逻辑上,每个树节点都包含对其子节点的引用。以下是我的节点类
的基础知识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;
}
}
当我打印新树的输出时,我得到一个空白。
答案 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);
}
}