Java二进制搜索树 - 递归空置复制方法

时间:2016-11-10 21:02:28

标签: java recursion binary-tree binary-search-tree

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

我真的不知道如何开始使用这样的东西,我所拥有的只是方法的漂亮外壳和它的包装器。我不确定私有方法中的参数是否正确,但这是我最好的猜测作为开始。

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

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

我会感激任何帮助。

谢谢!

1 个答案:

答案 0 :(得分: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);
          }
     }
}

你只需要用两个根节点调用它,让它递归并为你构建树。

因此,如果基本案例被触发(当前节点为空),则通过返回并在递归过程中继续跳过该节点(基本情况在递归技术中很重要,否则会得到无限递归)。因此,我们从根节点开始,复制它(如果它不为空),然后移动到左子树,假设它也不为空。我们暂停这个方法,在子树上调用方法,&#34;暂停&#34;在那里和左边的原因......当它一直向下返回时,它所拥有的每个地方都会暂停&#34;恢复,使用相同的过程移动到每个节点上的右子。一旦左子树自我递归,我们在顶部节点恢复并移动到右子树以在那里做同样的事情(就像在所有子节点中一样,递归地)。当它全部完成后,它就会正常返回。

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

这是一个粗略的想法,并没有经过测试,但这大致是我如何做到的。可能值得注意的是,如果主树已经有数据,或者你传递了根节点以外的节点,这种处理方式不能保证树是相同的。但是从那个节点下面也是一样的。