删除元素 BST
delete element BST
当我从BT中删除25时,它运行良好。 但是当我想删除另一个像 17 这样的数字时, 它删除了 17 个,其他一些数字从 BT 中删除。
#include<iostream>
using namespace std;
struct node
{
int data;
node *left;
node *right;
};
node *root = NULL;
node* createnode(int data)
{
node *t = new node();
t->data = data;
t->left = NULL;
t->right = NULL;
return t;
}
node* min(node*);
node* insert(node *root, int data)
{
if (root == NULL)
{
root = createnode(data);
return root;
}
else{
node *t = root;
if (data <= t->data)
t->left = insert(t->left, data);
else{
t->right = insert(t->right, data);
}
}
}
node* print(node *root)
{
if (root == NULL)
{
return root;
}
else{
cout << root->data << " ";
print(root->left);
print(root->right);
}
return root;
}
node* deleten(node *root, int data)
{
if (root == NULL)
return root;
else{
if (data<root->data)
root->left = deleten(root->left, data);
if (data>root->data)
root->right = deleten(root->right, data);
else{
if (root->left == NULL && root->right == NULL)
{
node *t = root;
root = NULL;
delete t;
}
else if (root->left == NULL)
{
node *t = root;
root = root->right;
delete t;
}
else if (root->right == NULL)
{
node *t = root;
root = root->left;
delete t;
}
else{
node *t = min(root->right);
root->data = t->data;
root->right = deleten(root->right, t->data);
}
}
return root;
}
}
node* min(node *root)
{
if (root == NULL)
return root;
else{
if (root->left != NULL)
min(root->left);
else{
return root;
}
}
}
int main()
{
root = insert(root, 15);
root = insert(root, 10);
root = insert(root, 8);
root = insert(root, 12);
root = insert(root, 11);
root = insert(root, 20);
root = insert(root, 23);
root = insert(root, 17);
root = insert(root, 25);
root = print(root);
cout << endl;
root = deleten(root, 17);
root = print(root);
}
案例1:
删除前 : 15 108 12 11 20 17 23 25
删除后 : 15 10 8 12 11 23 25//root=deleten(root,17(;
期望值 : 15 108 12 11 20 23 25
案例2:
删除前 : 15 108 12 11 20 17 23 25
删除后 : 15 108 12 11 20 17 23//root=deleten(root,25(;
期望值 : 15 10 8 12 11 20 17 23
案例3:
删除前 : 15 108 12 11 20 17 23 25
删除后 : 17 12 11 23 25//root= deleten(root,8(;
期望 : 15 1012 11 20 17 23 25
错误在这里:
if (data<root->data)
root->left = deleten(root->left, data);
if (data>root->data)
root->right = deleten(root->right, data);
else{
//...
}
如果data
小于root->data
,它将删除树的left
端和节点,因为您正在使用if
不else if
来测试正确。
答案很简单,改为else if
:
if (data<root->data)
root->left = deleten(root->left, data);
else if (data>root->data)
root->right = deleten(root->right, data);
else{
//...
}
相关文章:
- Mongodb c++驱动程序:如何查询元素的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 使用strcpy将char数组的元素复制到另一个数组
- 使用不带参数的函数访问结构元素
- 给定n个元素的m个集合.在C++中找到出现在最大集合数中的元素
- C++如何通过用户输入删除列表元素
- lower_bound()返回最后一个元素
- 基于多个条件处理地图中的所有元素
- 如何在给定特定节点的BST中找到直接较大的元素
- BST 不添加元素
- 删除元素 BST
- 返回 BST 中的第 K 个最小元素
- 如何将元素插入 BST
- 从 BST 中删除元素(指针错误)
- 使用BST的多数元素
- BST 递归解中的第 k 个最小元素
- 时间和空间复杂性在二叉树的每个级别创建元素向量(NON-BST)
- 从BST中删除重复元素
- 中缀,前缀或后缀顺序通过BST得到降序打印元素
- 如何找到BST的某个元素,给定关键字