使用C ++从二进制搜索树(递归)复制叶子

时间:2016-06-06 00:48:20

标签: c++ recursion binary-search-tree

我正在尝试将叶子(递归地)从BST复制到仅包含复制的叶子的新BST。这是我做的:

PersonId

在编译,访问叶子和复制它们时,代码似乎是正确的。但是,新树的根(27 void tree::copy_leafs(node * src, node *& dst) { 28 if (!src) //Case 1: current node is NULL 29 return; 30 if (!src->left && !src->right) { //Case 2: current node is a leaf 31 dst = new node; 32 dst->data = src->data; 33 dst->left = NULL; 34 dst->right = NULL; 35 copy_leafs(src->left, dst->left); 36 copy_leafs(src->right, dst->right); 37 } else { //Case 3: current node is NOT a leaf 38 copy_leafs(src->left, dst); 39 copy_leafs(src->right, dst); 40 } 41 } )始终只有一个叶子(最后一个叶子)。有什么想法吗?

EX问题:

  • 假设dst有这些叶子:src 4 15 19
  • 完成此功能后,23将只有dst

2 个答案:

答案 0 :(得分:1)

由于已在评论中找到错误,因此这是一个非常经过表面测试的解决方案。

你不能盲目复制节点;你需要创建一个BST结构 您可以先将叶子复制到左侧,将叶子复制到右侧,然后以合适的方式连接它们。

由于您从BST开始,左侧副本中的最大节点小于右侧副本中的最小节点。
这意味着如果使用左侧副本的根替换右侧副本中最左侧的左指针(为空),您将获得BST。

当然,这可能会导致一棵非常不平衡的树 如果你想平衡它,你需要一个更复杂的解决方案,这是一个练习。

假设这个节点结构:

struct node
{
    int datum;
    node* left;
    node* right;
    node(int v) : datum(v), left(nullptr), right(nullptr) {}
};

它看起来像这样:

node* copy_leaves(const node* tree)
{
    if (!tree)
    {
        return nullptr;
    }
    if (!tree->left && !tree->right)
    {
        return new node(tree->datum);
    }

    // Not a leaf; recurse
    node* left_leaves = copy_leaves(tree->left);
    node* right_leaves = copy_leaves(tree->right);
    if (!left_leaves)
    {
        return right_leaves;
    }
    else if (!right_leaves)
    {
        return left_leaves;
    }
    else
    {
        // Locate the leftmost node in the right tree.
        node* smallest_right = right_leaves;
        while (smallest_right->left != nullptr)
        {
            smallest_right = smallest_right->left;
        }
        // And attach the left leaf tree.
        smallest_right->left = left_leaves;
        return right_leaves;
    }
}

我相信有可能让copy_leaves也给你最左边的节点,这节省了一些自上而下的遍历,但它使代码变得复杂,所以我把它留作练习。

答案 1 :(得分:-1)

void copy_leaves(node * src, node *& dest)
{
    if (!src) return;

    dest = new node(src->data); // this should zero out the pointers, assuming you make one.

    copy_leaves(src->left, dest->left);
    copy_leaves(src->right, dest->right);
}