我无法弄清楚为什么我的树的删除功能有点"有些"删除节点。当我打印出结果时,"删除"节点显示为零。
例如: 添加节点7,3,9,然后删除节点9
输入: 加7,3,9 删除3
输出:0,7,9
void Tree::remove(int val) {
Node* temp;
if (root == nullptr)
{return;}
if (val == root->val)
{
if (root->left == nullptr && root->right == nullptr){ //leaf node
delete root;
}
else{
temp = root;
if (root->left != nullptr && root->right != nullptr){ //left and right children exist
if (root->left->val - val <= root->right->val - val){//left child is closer to value than right
int val_to_save = root->left->val;
root = root->left;
remove(val_to_save);
temp->val = val_to_save;//replace value with deleted node
root = temp;}
else{
int val_to_save = root->right->val;
root = root->right;
std::cout << val_to_save << std::endl;
remove(val_to_save);
temp->val = val_to_save;//replace value with deleted node
root = temp;}
}
else{ // only one child, either left or right
if(root->left != nullptr){ //left child
temp->left = root->left;
delete temp;}
else{ //right child
temp->right = root->right;
delete temp;}
}
}
}
else{ //value does not match
temp = root;
if (val < root->val)
{
temp = temp->left;
remove(val);
root = temp;
}
else{
root = root->right;
remove(val);
root = temp;}
}
}
答案 0 :(得分:0)
当您在c ++中调用delete时,您将释放该给定对象的内存。但是,你实际上并没有&#34;未宣布&#34;它。例如,如果删除root,它仍然知道root是一个节点。就像你要删除temp一样。因此,您似乎已成功删除它,删除其值并释放其内存。但是,该对象仍然存在,但实例化为null或以字节形式表示二进制0(&#39; \ 0&#39;)。当它打印\ 0时,结果显示为常规0。
我假设您希望您的答案打印为7,9正确吗?如果解释你的问题错了,请告诉我。
最佳
答案 1 :(得分:0)
考虑有3个节点,
[0] [7] [节点3] - GT;&LT - [node7] [3] [node9] - GT;&LT - [节点3] [9] [0]
我们要删除节点3,
void Tree::remove(int val)
{
Node* root = head; // head is head node
if (root)
{
if (val == root->val)
{
if(root->left)
root->left->right = root->right; // making the right of 7 node as the right of 3 node,
if(root->right)
root->right->left = root->left; //making the left of 9 node as the left of 3 node,
delete root;
root = 0;
}
}
}
when we are deleting 7, if(root->right) will execute only, so the 0 (value of 7node->left) is assigned to 3node->left, when we are deleting 3, if(root->left) will execute , so the node9 (value of 3node->left) is assigned to 3node->left, when we are deleting 3, if(root->right) will execute , so the node7 (value of 3node->left) is assigned to 9node->left, when we are deleting 7, if(root->left) will execute only, so the 0 (value of 9node->right) is assigned to 3node->right,