二叉搜索树的删除学习

看算法导论上,要设置父节点,然后求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);

                }

        }

}

posted @ 2010-12-05 19:13  hailong  阅读(138)  评论(0编辑  收藏  举报