• 二叉排序树的基本操作


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

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

    #include <bits/stdc++.h>
    using namespace std;
    bool f;
    struct node
    {
        int data;
        node *l, *r;
    };
    void menu()
    {
        puts("
    1.建立二叉排序树");
        puts("2.中序遍历二叉排序树");
        puts("3.插入元素");
        puts("4.删除键值元素");
        puts("-1.-1结束
    ");
    }
    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

     

  • 相关阅读:
    How to publish ASP.NET application
    Enable(Disable) JavaScript on Browsers(Opera,IE,Firefox,Googlechrome,Safari)
    批处理学习笔记
    [转] Springboot 解决跨域的四种姿势
    HTML+CSS编写规范
    利用CSS3的transform做的动态时钟
    JS特效文字逐个显示
    Asp.Net平台下的图片在线裁剪功能的实现
    CSS3实践之路(一):CSS3之我观
    推荐个通用的多图片上传插件 multiimage。
  • 原文地址:https://www.cnblogs.com/lesroad/p/9143528.html
Copyright © 2020-2023  润新知