2016-11-10 155 views
-1

我需要为从头开始的二进制搜索树创建一个递归复制方法,用于我的分配。该方法应该将给定的BinarySearchTree对象中的每个项目复制到调用的BinarySearchTree对象中。唯一的问题是该方法必须是void,并且我在这个主题上查找的所有内容似乎都使用不同的返回类型来完成此操作。Java二进制搜索树 - 递归无效复制方法

我真的不知道如何开始这样的事情,我所拥有的只是方法的很多空壳,它是包装。我不确定私人方法中的参数是否正确,但这是我最好的猜测。

public void copy(BinarySearchTree<E> bst2){ 
     copy(bst2, root, bst2.root); 
    } 

private void copy(BinarySearchTree<E> bst2, Node node1, Node node2){ 
    } 

我会很感激任何和所有的帮助。

谢谢!

+1

嗯,这个问题没有解释很多问题。我可以给出的唯一提示是,如果你不能通过返回来处理结果,你将不得不改变已经给定的结构,并通过参数把它交给方法。 – Paul

+0

我想你可能想看看这个:http://stackoverflow.com/questions/5372512/java-binary-search-tree-recursive-copy-tree?rq=1 – Tim

回答

1

立即想到的是(提前粗糙的伪代码):

class Tree { 
    //stuff in the tree with a root node, etc... 

    copyTree(Node parentTreeNode, Node copyTreeNode) { 
      if(copyTreeNode == null) 
       return; 
      parentTreeNode = clone(copyTreeNode) //clone just copies the node's values into the node. 
      if(copyTreeNode.leftChild != null) { 
       parentTreeNode.leftChild = new Node(); 
       copyTree(parentTreeNode.leftChild, copyTreeNode.leftChild); 
      } 
      if(copyTreeNode.rightChild != null) { 
       parentTreeNode.rightChild = new Node(); 
       copyTree(parentTreeNode.rightChild, copyTreeNode.rightChild); 
      } 
    } 
} 

而且你只需调用此方法,两个根节点,让它递归并构建树为您服务。因此,如果基本情况被触发(当前节点为空),那么通过在递归过程中返回并继续(基本情况在递归技术中很重要,否则您将获得无限递归)而跳过该节点。所以,我们从根节点开始,复制它(如果它不为空),然后移动到左侧子树,假设它也不为空。我们暂停使用这种方法,在子树上调用该方法,在那里“暂停”并导致左侧....当它一直向下返回时,每个它“暂停”的地方都会恢复,移动到右侧的孩子在每个节点上使用相同的过程。一旦左子树自身递归,我们继续在顶层节点并移动到右子树,在那里做同样的事情(就像它在所有子节点中一样,递归地)。完成后,它会正常返回。

递归不是特别困难,但首先需要一些练习来理解。

这是一个粗略的想法,并没有经过测试,但这大概是我该怎么做。可能值得注意的是,如果主树中已经有数据,或者您交给除根节点以外的节点,则处理它的这种样式不能保证树是相同的。但是从该节点下面将是相同的。