C++:复制具有加倍节点的二叉树
C++: Duplicating a Binary Tree with Doubled up Nodes
目标是创建一棵树的副本,其中每个节点的值都是原始节点值的两倍。该函数应该递归地实现。我写了一些创建新树的代码,但错误是我的代码从未创建 "full copy",它总是只有前两个级别。
Node* doubleUp(Node* root) {
int value = root->data;
Node* newroot = new Node(value*2);
if(root->left != NULL)
{
int value = (root->left)->data;
Node* left = new Node(value*2);
newroot->left = left;
doubleUp(newroot->left);
}
if(root->right != NULL)
{
int value = (root->right)->data;
Node* right = new Node(value*2);
newroot->right = right;
doubleUp(newroot->right);
}
return newroot;
}
我明白为什么要这样做,该函数总是创建一个 "newroot",而不是在第一级之后它应该只接受传递给它的参数。但不确定如何修复它。
这是一个示例树,使用了 Node 结构。
Node a(0), b(4), c(2), d(1), e(5), f(6), g(3), h(7);
a.left=&b;
a.right=&c;
c.left=&f;
b.left=&d;
b.right=&e;
d.left=&g;
d.right=&h;
你没有对左右子树的 doubleUp 的 return 值做任何事情,所以你的递归是错误的。(你的调用实际上是在泄漏内存!)你真正想要的做,是这样的:
Node* doubleUp(Node* root) {
Node* doubledRoot = new Node(root->data * 2);
if (root->left) {
newRoot->left = doubleUp(root->left);
}
if (root->left) {
newRoot->right = doubleUp(root->right);
}
return doubledRoot;
}
请记住,我还没有实际测试过这段代码,因此它可能会出现轻微问题,但应该传达了基本思想。
可能简单一点
Node* doubleUp(Node* root)
{
if (root == nullptr)
return nullptr
Node* newroot = new Node(root->data*2);
newroot->left = doubleUp(root->left);
newroot->right = doubleUp(root->right);
return newroot;
}
目标是创建一棵树的副本,其中每个节点的值都是原始节点值的两倍。该函数应该递归地实现。我写了一些创建新树的代码,但错误是我的代码从未创建 "full copy",它总是只有前两个级别。
Node* doubleUp(Node* root) {
int value = root->data;
Node* newroot = new Node(value*2);
if(root->left != NULL)
{
int value = (root->left)->data;
Node* left = new Node(value*2);
newroot->left = left;
doubleUp(newroot->left);
}
if(root->right != NULL)
{
int value = (root->right)->data;
Node* right = new Node(value*2);
newroot->right = right;
doubleUp(newroot->right);
}
return newroot;
}
我明白为什么要这样做,该函数总是创建一个 "newroot",而不是在第一级之后它应该只接受传递给它的参数。但不确定如何修复它。
这是一个示例树,使用了 Node 结构。
Node a(0), b(4), c(2), d(1), e(5), f(6), g(3), h(7);
a.left=&b;
a.right=&c;
c.left=&f;
b.left=&d;
b.right=&e;
d.left=&g;
d.right=&h;
你没有对左右子树的 doubleUp 的 return 值做任何事情,所以你的递归是错误的。(你的调用实际上是在泄漏内存!)你真正想要的做,是这样的:
Node* doubleUp(Node* root) {
Node* doubledRoot = new Node(root->data * 2);
if (root->left) {
newRoot->left = doubleUp(root->left);
}
if (root->left) {
newRoot->right = doubleUp(root->right);
}
return doubledRoot;
}
请记住,我还没有实际测试过这段代码,因此它可能会出现轻微问题,但应该传达了基本思想。
可能简单一点
Node* doubleUp(Node* root)
{
if (root == nullptr)
return nullptr
Node* newroot = new Node(root->data*2);
newroot->left = doubleUp(root->left);
newroot->right = doubleUp(root->right);
return newroot;
}