我正在尝试将叶子(递归地)从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
。答案 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);
}