Java二进制搜索树递归复制树

时间:2011-03-20 23:59:27

标签: java recursion copy binary-tree

我正在研究一个需要我递归复制二叉搜索树并返回树的问题。我在二进制搜索树类中编码,因此它将复制它所调用的任何二进制搜索树。要求说私有方法的返回类型必须为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;
    }
}

2 个答案:

答案 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;
}

(后继是一个返回前面对象条目的方法) 感谢大家的帮助解决问题!