二叉搜索树的删除学习
看算法导论上,要设置父节点,然后求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); } } }