删除BST中的节点
delete a node in BST
我正在尝试实现BST的删除。我使用的算法是:
- 如果搜索匹配一个节点
1.1。如果剩下的子节点,请交换该节点的值及其左子节点。并再次调用左节点的功能。
1.2。否则,如果没有左节点,但是有右节点,请交换节点的值和右节点。调用右节点的功能。
1.3。如果没有左和右节点,请删除此节点。
以下是类定义。
class node{
public:
int value;
node *left;
node *right;
node(){value=0; left=0; right =0;}
node(int value){this -> value = value; left=0;right=0;}
void print();
};
class tree{
public:
node *root;
tree(){
root = 0;
}
~tree(){}
void remove(node *, int);
//tree(int value){root = &node(value);}
void insert(int);
void printSorted(node *);
void printAll(node *);
};
print()函数要打印出我是...,我的左孩子是...,我的右孩子是...
void node::print(){
if(this == 0) return;
cout<<"i am "<<value<<endl;
if(left !=0){
cout<<"i have left, left is "<<left -> value<<endl;
}
if(right !=0){
cout<<"i have right, right is "<<right -> value <<endl;
}
}
printall()函数,从根和打印顺序遍历。
void tree::printAll(node *nodeP){
if(nodeP == 0) return;
else{
node *iter = nodeP;
if(iter -> left !=0){
printAll(iter->left);
}
iter->print();
cout<<endl;
if(iter -> right !=0){
printAll(iter -> right);
}
}
}
这是删除函数。
void tree::remove(node* origin, int toDel){
if(origin == 0) return;
node *orig_origin = origin;
int tmp;
if(origin -> value == toDel){
if((origin -> left == 0) && (origin -> right == 0)){
delete origin;
origin =0;
}
else if((origin -> left != 0) && (origin -> right == 0)){
tmp = origin -> value;
origin -> value = origin -> left -> value;
origin -> left -> value = tmp;
remove(origin -> left, toDel);
}
else if((origin -> left == 0) && (origin -> right != 0)){
tmp = origin -> value;
origin -> value = origin -> right -> value;
origin -> right -> value = tmp;
remove(origin -> right, toDel);
}
else{
tmp = origin -> value;
origin -> value = origin -> left -> value;
origin -> left -> value = tmp;
remove(origin -> left, toDel);
}
}
else{
if(origin -> value > toDel) remove(origin -> left, toDel);
else remove(origin -> right, toDel);
}
origin = orig_origin;
}
i输入7 4 10 1 6 5调用删除后,1处于原始4的位置。但是还有0。所以我以某种方式未能删除原始的1个节点。
sc-xterm-24:~/scratch/code/cpp_primer> ./a.out
7 4 10 1 6 5
i am 0
i am 1
i have left, left is 0
i have right, right is 6
i am 5
i am 6
i have left, left is 5
i am 7
i have left, left is 1
i have right, right is 10
i am 10
当您在树中找到值时,最后一个情况(左和右分支)的处理是错误的。您不能交换origin->value
和origin->left->value
,因为这打破了树的订购所需的要求。由于原始origin->value
大于左子树中存储的所有值,因此新的origin->left->value
将大于origin->left->right
子树中存储的所有值。由于节点中的值应少于存储在正确树中的所有内容,因此沿该分支的未来搜索可能会失败或找到错误的节点。
相关文章:
- 比较C++中两个BST的节点
- 递归函数,用于计算 BST 中具有两个子节点的节点数
- 检查BST中每个节点的平衡因子并将其存储在节点中
- 删除BST节点:三重故障
- 如何在给定特定节点的BST中找到直接较大的元素
- 为什么我不能将从我的 BST 获取的这个节点推送到这个堆栈中?
- 在BST堆中删除节点免错误
- 如何结合findMin()和delete()来删除BST中的最小节点
- C bST删除节点会破坏排序算法
- 从BST删除节点时出错
- 在 BST 中插入节点时出现逻辑错误
- 递归地将 1 添加到 BST 中的所有节点,但具有最小数据的节点除外
- BST 节点删除 - 指针未正确删除
- 将节点插入 BST
- 删除BST中的节点
- 找到任何节点的BST高度
- 如何在BST中从最高到最低打印特定范围内的数字,访问的节点最少
- 从 BST 中删除唯一的节点
- 如何从最高到最低输出BST的节点值?
- BST 删除/删除节点 - 根