二叉排序树之删除结点

删除二叉排序树中值为k的结点

用被删结点左子树最右下的结点的值代替被删结点的值,然后删去最右下的结点

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#include "stdafx.h"
#include<iostream>
using namespace std;
typedef struct BSTreeNode
{
    int data;
    struct BSTreeNode *lchild,*rchild;
}BSTree;
int _tmain(int argc, _TCHAR* argv[])
{
    return 0;
}
void Delete(BSTree *bst,int x)
{
    BSTree *f,*p=bst;
    while(p&&p->data!=x)//查找值为x的结点
    {
        if(p->data>x)
        {
            f=p;p=p->lchild;
        }
        else
        {
            f=p;p->rchild;
        }
    }
    if(p==NULL)exit(0);//没找到
    if(p->lchild==NULL)//被删结点没有左子树,直接将右子树接到其双亲上
    {
        if(f->lchild==p)f->lchild=p->rchild;
        else f->rchild=p->rchild;
    }
    else//被删结点有左子树
    {
        BSTree *q=p->lchild,*s=q;
        while(q->rchild!=NULL)//查找左子树最右下的结点(中序最后结点)
        {
            s=q;q=q->rchild;
        }
        if(s==p->lchild)//p左子树的根结点无右子女
        {
            p->data=s->data;
            p->lchild=s->lchild;
            free(s);
        }
        else
        {
            p->data=q->data;
            s->rchild=q->lchild;
            free(q);//删除q结点
        }
    }
}

另一种方法: 

用被删结点右子树最左下的结点的值代替被删结点的值,然后删去最左下的结点

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
void Delete(BSTree *bst,int x)
{
    BSTree *f,*p=bst;
    while(p&&p->data!=x)//查找值为x的结点
    {
        if(p->data>x)
        {
            f=p;p=p->lchild;
        }
        else
        {
            f=p;p->rchild;
        }
    }
    if(p==NULL)exit(0);//没找到
    if(p->rchild==NULL)//被删结点没有右子树,直接将左子树接到其双亲上
    {
        if(f->lchild==p)f->lchild=p->lchild;
        else f->rchild=p->lchild;
    }
    else//被删结点有右子树
    {
        BSTree *q=p->rchild,*s=q;
        while(q->lchild!=NULL)//查找右子树最左下的结点(中序最先结点)
        {
            s=q;q=q->lchild;
        }
        if(s==p->rchild)//p左子树的根结点无左子女
        {
            p->data=s->data;
            p->rchild=s->rchild;
            free(s);
        }
        else
        {
            p->data=q->data;
            s->lchild=q->rchild;
            free(q);//删除q结点
        }
    }
}

 

posted @   代码改变未来  阅读(5469)  评论(1编辑  收藏  举报
努力加载评论中...
点击右上角即可分享
微信分享提示