递归地将所有叶子从BST复制到另一个BST

时间:2016-11-28 04:09:43

标签: c++ algorithm recursion

我已经制定出了如何将树叶从BST复制到另一个BST的算法。

  1. 检查树是否为空
  2. 如果我们到达了一个叶子,请将数据复制到目的地BST。
  3. 使用源BST调用递归函数 - >左和源BST - >正确的目的地指向相应的方向
  4. 否则,在没有dest的情况下递归调用 - > left或dest - >对(因为我们将进入null)。
  5. 这个算法会起作用吗?

    434 int copy_leaves(node * source, node * & dest)
    435 {   
    436     if (!source)
    437     {
    438         dest = NULL;
    439         return 0;
    440     }
    441     
    442     if (!(source -> left) && !(source -> right))
    443     {
    444         dest = new node;
    445         dest -> data = source -> data; 
    XXX         dest -> left = dest -> right = NULL;
    446     }
    447     
    448     return copy_leaves(source -> left, dest) + //???
    449         copy_leaves(source -> right, dest) + 1; //???
    450 }
    

    好的我尝试实现我的算法,但有几个错误。我不太清楚在哪里做递归调用。我知道我在两次调用后达到null(然后我们知道节点是一个叶子),这意味着我复制了数据。我不知道在哪里传递dest->右和dest - >留给递归电话。

1 个答案:

答案 0 :(得分:1)

我不知道这是如何运作的。我会用一些缩进来回应这个:

BST_copy(src, dst)
    # step 1
    if tree is empty
        <action not specified; assume return>
    else
        # step 2
        if src is a leaf
            copy data to the destination tree
            # step 3
            BST_copy(src->left,  dst->left)
            BST_copy(src->right, dst->right)
        #step 4
        else
            BST_copy(src->left,  dst)
            BST_copy(src->right, dst)
  • 第1步:您还没有指定行动;请填写。
  • 步骤2:目标树是否已具有与源树相同的完整结构?如果没有,你是如何管理副本的?
  • 步骤3:如果树是一片叶子,那么就没有剩下的&amp;正确的子树;当你知道链接是 null
  • 时,你为什么要重复出现?
  • 第4步:这会让你的结构失去同步;你在源树中沿着两个分支向下移动了一个级别,但是你还没有下降到目标树中。如果这在你的设置中有效,那么这个算法中还没有关于树结构或复制操作的内容。