m0_52049919 2021-07-09 08:49 采纳率: 100%
浏览 29
已结题

二叉树完整代码,完整代码,完整代码

二叉排序树的建立、插入、删除和查找
给出一组关键值,建立相应的二叉排序树,完成:
⑴结点的删除操作。要求可以实现删除根结点、叶子结点以及其它任意结点的功能;
⑵插入一个新结点的操作;
⑶对给定的值在二叉排序树进行查找;
⑷随时显示操作的结果。
要代码,完整代码

  • 写回答

3条回答 默认 最新

  • 关注

    img

    #include <stdio.h>
    #include <stdlib.h>
    
    typedef struct node
    {
        int key;
        struct node *lchild,*rchild;
    }BSTNode;
    
    //二叉排序树插入操作递归算法
    BSTNode *InsertBST1(BSTNode *T, int key)
    {
        BSTNode *p, *q = T;
    
        //p为待插入的新结点
        p = (BSTNode *)malloc(sizeof(BSTNode));
        p->key = key;
        p->lchild = p->rchild = NULL;
    
        if(T == NULL) //原树为空
            T = p; //新插入的结点为新的根
    
        //原树非空时将新结点p作为q的左孩子或右孩子插入
        else
        {
            if(key == q->key)
                return T;
    
            if(key < q->key)
            {
                if(q->lchild ==NULL)
                    q->lchild = p;
                else
                    InsertBST1(q->lchild, key);
            }
    
            if(key > q->key)
            {
                if(q->rchild ==NULL)
                    q->rchild = p;
                else
                    InsertBST1(q->rchild, key);
            }
        }
        return T;
    }
    
    BSTNode *InsertBST2(BSTNode *T, int key)
    {
        BSTNode *f, *p = T;
    
        //查找插入位置
        while(p)
        {
            if(key == p->key)
                return T;//无须插入
    
            f = p;//记录访问的结点
            if(key < p->key)
                p = p->lchild;
            else
                p = p->rchild;
            //若key<p->key,则在左子树中查找,否则在右子树中查找
        }
    
        //p为待插入的新结点
        p = (BSTNode *)malloc(sizeof(BSTNode));
        p->key = key;
        p->lchild = p->rchild = NULL;
    
        if(T == NULL) //原树为空
            T = p; //新插入的结点为新的根
    
        //原树非空时将新结点q作为p的左孩子或右孩子插入
        else
        {
            if(key < f->key)
                f->lchild = p;
            else f->rchild = p;
        }
    
        return T;
    }
    
    //二叉排序树删除操作
    void DelBST(BSTNode *T,int key)
    {
        BSTNode *p = T, *f, *q, *s;
        while(p)
        {
            if(p->key == key) break; //找到关键字为key的结点
            f=p;//记下关键字key节点的父节点
            p=(key < p->key)? p->lchild : p->rchild;//分别在*p的左、右子树中查找
        }
        if(!p) return;//二叉排序树中无关键字为key的结点
        if(p->lchild == NULL && p->rchild == NULL)//p无左子树无右子树
        {
            if(p == T) T = NULL;//删除的是根节点
            else
                if(p == f->lchild)
                    f->lchild = NULL;
                else
                    f->rchild = NULL;
        }
        else if(p->lchild == NULL && p->rchild != NULL)//p无左子树有右子树
        {
            if(f->lchild == p)
                f->lchild = p->rchild;
            else
                f->rchild = p->rchild;
        }
        else if(p->rchild == NULL && p->lchild != NULL)//p有左子树无右子树
        {
            if (f->lchild == p)
                f->lchild = p->lchild;
            else
                f->rchild = p->lchild;
        }
        else if(p->lchild != NULL && p->rchild != NULL)//p既有左子树又有右子树
        {
            q = p;
            s = p->lchild;//转左
            while(s->rchild)
            {//然后向右到尽头
                q = s;
                s = s->rchild;//s指向被删节点的“前驱”(中序前驱)
            }
            p->key = s->key;//以p的中序前趋结点s代替p(即把s的数据复制到p中)
            if(q != p)
                q->rchild = s->lchild;//重接q的右子树
            else
                q->lchild = s->lchild;//重接q的左子树。
        }
    }
    
    
    //创建二叉排序树
    BSTNode *CreateBST()
    {
        BSTNode *T = NULL; //初始时T为空树
        int key;
        printf("请输入一系列数,以0结尾:");
        while(1)
        {
            scanf("%d", &key);//读入一关键字
            if(key == 0)
                break;//假设key=0是输入结束标志
            else
                T = InsertBST1(T, key); //使用递归算法,将key插入二叉排序树T,改为 T = InsertBST2(T, key);为非递归插入算法
        }
        return T; //返回建立的二叉排序树的根指针
    }
    
    //二叉排序树查找递归算法
    int BSTsearch1(BSTNode *T, int data)
    {
        BSTNode *p = T;
        if(!p)
            return 0;
        else if(p->key == data)
                return 1;
            else if(p->key > data)
                    return BSTsearch1(p->lchild, data);
                else
                    return BSTsearch1(p->rchild, data);
    }
    
    //二叉排序树查找非递归算法
    int BSTsearch2(BSTNode *T, int data)
    {
        BSTNode *p = T;
        while(p)
        {
            if(p->key == data)
                return 1;
            p = (p->key > data)? p->lchild : p->rchild;
        }
        return 0;
    }
    
    //中序遍历得到的是一个有序的序列,实现了排序功能
    void Inorder(BSTNode *T)
    {
        if(T)
        {
            Inorder(T->lchild);
            printf("%d ",T->key);
            Inorder(T->rchild);
        }
    }
    
    int main()
    {
        BSTNode *T = NULL;
        int data1,data2;
        T = CreateBST();
    
        printf("以上述数建立的二叉排序树,中序遍历的结果:");
        Inorder(T);
    
        printf("\n输入待搜索的数据data1=");
        scanf("%d", &data1);
        //递归算法查找
        if(BSTsearch1(T, data1))
            printf("%d存在\n");
        else
            printf("%d不存在\n");
    
        printf("\n输入插入数据");
        scanf("%d", &data1);
        InsertBST1(T, data1);
        Inorder(T);
        printf("\n输入待删除的数据data2=");
        scanf("%d", &data2);
        DelBST(T,data2);
        printf("删除后的二叉排序树,中序遍历的结果:");
        Inorder(T);
    
        return 0;
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 4月26日
  • 已采纳回答 4月18日
  • 创建了问题 7月9日

悬赏问题

  • ¥15 帮我写一个c++工程
  • ¥30 Eclipse官网打不开,官网首页进不去,显示无法访问此页面,求解决方法
  • ¥15 关于smbclient 库的使用
  • ¥15 微信小程序协议怎么写
  • ¥15 c语言怎么用printf(“\b \b”)与getch()实现黑框里写入与删除?
  • ¥20 怎么用dlib库的算法识别小麦病虫害
  • ¥15 华为ensp模拟器中S5700交换机在配置过程中老是反复重启
  • ¥15 java写代码遇到问题,求帮助
  • ¥15 uniapp uview http 如何实现统一的请求异常信息提示?
  • ¥15 有了解d3和topogram.js库的吗?有偿请教