c++ - 当我基本上复制代码时,为什么会得到不同的输出?(删除节点并用最深的节点替换)
问题描述
我正在尝试用最深的节点删除和替换一个节点,但我的程序只删除了该节点。
我研究了在互联网上找到的代码并复制了代码,但我得到的输出与原始程序不同。
原始输出:
Inorder traversal before deletion : 7 11 12 10 15 9 8
Inorder traversal after deletion : 7 8 12 10 15 9
我的程序:
Inorder traversal before deletion : 7 11 12 10 15 9 8
Inorder traversal after deletion : 7 12 10 15 9 8
我需要帮助来理解为什么会这样?以及如何解决它?
原始程序-> https://www.geeksforgeeks.org/deletion-binary-tree/
我的程序
#include<bits/stdc++.h>
using namespace std;
struct Node
{
int key;
struct Node* left;
struct Node* right;
};
struct Node* newNode(int key)
{
struct Node* temp= new Node;
temp->key=key;
temp->left=temp->right=NULL;
return temp;
}
void inorder(struct Node* temp)
{
if(!temp)
return;
inorder(temp->left);
cout<<temp->key<<" ";
inorder(temp->right);
}
void deletDeepest(struct Node* root,struct Node* d_node)
{
queue <struct Node*> q;
q.push(root);
struct Node* temp;
while(!q.empty())
{
temp = q.front();
q.pop();
if(temp==d_node)
{
temp=NULL;
delete(d_node);
return;
}
if(temp->right)
{
if(temp->right==d_node)
{
temp->right=NULL;
delete(d_node);
return;
}
else
q.push(temp->right);
}
if(temp->left)
{
if(temp->left==d_node)
{
temp->left=NULL;
delete(d_node);
return;
}
else
q.push(temp->left);
}
}
}
void deletion(struct Node* root, int key)
{
struct Node* temp;
struct Node* key_node=NULL;
queue <struct Node*> q;
q.push(root);
while(!q.empty())
{
temp=q.front();
q.pop();
if(temp->key==key)
key_node=temp;
if(temp->right)
q.push(temp->right);
if(temp->left)
q.push(temp->left);
}
int x = temp->key;
deletDeepest(root,temp);
key_node->key=x;
}
int main()
{
struct Node* root = newNode(10);
root->left = newNode(11);
root->left->left = newNode(7);
root->left->right = newNode(12);
root->right = newNode(9);
root->right->left = newNode(15);
root->right->right = newNode(8);
cout << "Inorder traversal before deletion : ";
inorder(root);
int key = 11;
deletion(root, key);
cout << endl;
cout << "Inorder traversal after deletion : ";
inorder(root);
return 0;
}
解决方案
这是一个非传统的顺序:
if(temp->right)
q.push(temp->right);
if(temp->left)
q.push(temp->left);
}
看原作的顺序也与原作不同。
推荐阅读
- c# - 在 Xamarin.Forms 中动态创建网格
- dsl - 从一个功能设置空手道中的全局变量以用于另一个功能
- css - 如何为输入文本创建光标?
- svn - 使用 Netbeans 的“SVN:导入到存储库”的问题
- jquery - 空数组的jQuery .val问题
- testing - 哪个是为可访问性测试创建报告的最佳工具?
- django - Django 频道 group_send 无法正常工作
- jquery - 在 mod pagespeed 之后,jQuery Datepicker 不再工作
- cypress - 赛普拉斯:无法使用 cy.visit 启动 URL
- javascript - 如何在javascript中按小时/6小时/天/周/月/年对日期对象进行分组