我正在研究一个需要我递归复制二叉搜索树并返回树的问题。我在二进制搜索树类中编码,因此它将复制它所调用的任何二进制搜索树。要求说私有方法的返回类型必须为Entry<E>
,参数类型为Entry<E>
。我遇到的问题是将多个条目添加到树中。
以下是我目前的情况:
public BinarySearchTree<E> rcopy(){
BinarySearchTree newTree = new BinarySearchTree();
newTree.add(rcopy(root).element);
return newTree;
}
private Entry <E> rcopy(Entry <E> current){
if(current.left!=null) return rcopy(current.left);
if(current.right!=null) return rcopy(current.right);
return current;
}
这是Entry课程,所以你知道我可以使用的是什么:
protected static class Entry<E> {
protected E element;
protected Entry<E> left = null,
right = null,
parent;
protected int pos;
protected Entry<E> link = null;
public Entry() { }
public Entry (E element, Entry<E> parent)
{
this.element = element;
this.parent = parent;
}
}
答案 0 :(得分:3)
private Entry <E> rcopy(Entry <E> current){
if(current.left!=null) return rcopy(current.left);
if(current.right!=null) return rcopy(current.right);
return current;
}
这不会复制任何内容。它将返回当前节点的最左侧(或最右侧,如果没有左侧子节点;或当前节点,如果它是叶节点)子节点。因为你总是返回当前。你需要一些像:
private Entry <E> rcopy(Entry <E> current){
if (current == null) return null;
return new Entry <E> (current.element, rcopy(current.left), rcopy(current.right)); //write a constructor for that
}
并实际复制节点。我没有测试过代码而且有点迟了,希望它仍然是正确的。
您是否有理由区分BinarySearchTree<E>
和Entry<E>
?树不是树的一部分吗?
答案 1 :(得分:0)
我想我会分享我得到的解决方案。我的主要问题是没有对对象进行深层复制,所以它会引用该对象而不是创建一个新对象。
public BinarySearchTree<E> rcopy(){
BinarySearchTree<E> newTree = new BinarySearchTree<E>();
newTree.root = rcopy(root);
newTree.size=newTree.nodes();
return newTree;
}
private Entry <E> rcopy(Entry <E> current){
Entry <E> b=new Entry<E>();
if(current!=null){
if(current.left!=null)b.left=rcopy(current.left);
if(current.right!=null)b.right=rcopy(current.right);
b.element = current.element;
b.parent = successor(current);
}
return b;
}
(后继是一个返回前面对象条目的方法) 感谢大家的帮助解决问题!