二叉排序树的基本操作

静态查找中二分查找效率最高,但是它要求关键字有序,且不能用链表作为存储结构,为了维护表的有序性,势必要学会动态查找的方法,即二叉排序树。

下面将给出二叉查找树插入及删除操作的方法。

#include <bits/stdc++.h>
using namespace std;
bool f;
struct node
{
    int data;
    node *l, *r;
};
void menu()
{
    puts("\n1.建立二叉排序树");
    puts("2.中序遍历二叉排序树");
    puts("3.插入元素");
    puts("4.删除键值元素");
    puts("-1.-1结束\n");
}
void add(node *&BT, int x)
{
    if(!BT)
    {
        BT = (node *)malloc(sizeof(node));
        BT->data = x;
        BT->l = BT->r = NULL;
    }
    else if(BT->data > x) add(BT->l, x);
    else if(BT->data < x) add(BT->r, x);
    else f = 1;
}
void create(node *&BT)
{
    int x;
    while(1)
    {
        cin>>x;
        if(x == -1) return;
        add(BT, x);
    }
}
void visit(node *BT)
{
    if(BT)
    {
        visit(BT->l);
        printf("%d ", BT->data);
        visit(BT->r);
    }
}
void Delete(node *&BT, int x)
{
    node *t;
    if(!BT)
    {
        puts("未找到此元素");
        f = 1;
    }
    else if(BT->data < x) Delete(BT->r, x);
    else if(BT->data > x) Delete(BT->l, x);
    else
    {
        if(!BT->l && !BT->r)          //无左右孩子
        {
            free(BT);
            BT = NULL;
        }
        else if(!BT->l && BT->r)      //仅有右孩子
        {
            free(BT);
            BT = BT->r;
        }
        else if(BT->l && !BT->r)     //仅有左孩子
        {
            free(BT);
            BT = BT->l;
        }
        else                        //左右都有
        {
            t = BT->r;
            while(t->l)
                t = t->l;
            BT->data = t->data;
            Delete(BT->r, t->data);
        }
    }
}
int main()
{
    int x, n;
    node *BT = NULL;
    while(1)
    {
        menu();
        cin>>x;
        if(x == -1) break;
        switch(x)
        {
        case 1:
            puts("请输入关键字,-1结束");
            create(BT);
            puts("建立成功");
            break;
        case 2:
            puts("遍历序列为:");
            visit(BT);
            break;
        case 3:
            puts("请输入插入关键字");
            f = 0;
            cin>>n;
            add(BT, n);
            if(f) puts("存在重复键值!");
            else puts("插入成功!");
            break;
        case 4:
            puts("请输入删除键值:");
            cin>>n;
            f = 0;
            Delete(BT, n);
            if(!f) puts("删除成功!");
            break;
        default:
            puts("输入错误!");
        }
    }
    return 0;
}

 

 

方案:

 

建立树: 13 66 1 22 30 9 10 76 8 14 15 5  -1

插入元素:15 12

删除元素:30

 

posted @ 2018-06-06 09:55  LesRoad  阅读(1546)  评论(2编辑  收藏  举报