java中删除node节点_删除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<

if(left !=0){

cout< value<

}

if(right !=0){

cout< value <

}

}

printAll()函数,从根遍历并按顺序打印 .

void tree::printAll(node *nodeP){

if(nodeP == 0) return;

else{

node *iter = nodeP;

if(iter -> left !=0){

printAll(iter->left);

}

iter->print();

cout<

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;

}

我在调用删除后输入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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值