二叉搜索树的删除学习
看算法导论上,要设置父节点,然后求presuccessor。但是感觉这样子增加了不少麻烦,搜到一个不用父节点的方法,但是看起来也相当复杂。
代码贴上:
struct node {
int value;
node *lchild;
node *rchild;
};
void del(node *&head, int x)
{
// printf("%d\n", x);
node *p = find(head, x);
if(p == NULL) return;
else if(p == head) {
if(p->rchild->lchild == NULL) {
head->rchild->lchild = head->lchild;
head = head->rchild;
free(p);
} else {
node *m = p->rchild->lchild;
while(m->lchild->lchild != NULL) {
m = m->lchild;
}
node *n = m->lchild;
m->lchild = n->rchild;
n->lchild = p->lchild;
n->rchild = p->rchild;
head = n;
free(p);
}
return;
}
node *q,*m,*n;
if(x > p->value) {
q = p->rchild;
if(q->rchild == NULL) {
p->rchild = q->lchild;
free(q);
}
else if(q->rchild->lchild == NULL) {
p->rchild = q->rchild;
p->rchild->lchild = q->lchild;
} else {
m = q->rchild->lchild;
while(m->lchild->lchild != NULL) {
m = m->lchild;
}
n = m->lchild;
m->lchild = n->rchild;
n->lchild = q->lchild;
n->rchild = q->rchild;
p->rchild = n;
free(q);
}
}
else {
q = p->lchild;
if(q->lchild == NULL) {
p->lchild = q->rchild;
free(q);
} else if(q->lchild->rchild == NULL) {
p->lchild = q->lchild;
p->lchild->rchild = q->rchild;
} else {
m = q->lchild->rchild;
while(m->rchild->rchild != NULL) {
m = m->rchild;
}
n = m->rchild;
m->rchild = n->lchild;
n->lchild = q->lchild;
n->rchild = q->rchild;
p->lchild = n;
free(q);
}
}
}

浙公网安备 33010602011771号