zoukankan      html  css  js  c++  java
  • 二叉排序树的插入、生成、删除及查找操作

    二叉排序树的性质:

    (1)若它的左子树不为空,左子树上所有节点的关键字均小于它的根节点的关键字;

    (2)若它的右子树不为空,右子树上所有节点的关键字均大于它的根节点的关键字;

    (3)它的左右子树也均为二叉排序树

    #include<stdio.h>
    #include<stdlib.h>
    
    typedef struct node
    {
        int key;
        struct node *lchild;
        struct node *rchild;
    };
    
    
    void InsertBST(struct node **bst,int key)
    {
        struct node *s;
    
        if(*bst==NULL)
        {
            s=(struct node *)malloc(sizeof(struct node));  //申请新的节点
            s->key=key;
            s->lchild=NULL;
            s->rchild=NULL;        
        }
        else
        {
            if(key<(*bst)->key)
            {
                InsertBST(&((*bst)->lchild),key);
            }
            else
            {
                InsertBST(&((*bst)->rchild),key);
            }
        }
    }
    
    void CreatBST(struct node **bst)   //从键盘输入记录关键字,创建二叉排序树
    {
        int key;
    
        *bst=NULL;
        scanf("%d",&key);
        while(key!=0)             //输入0时为结束标志
        {
            InsertBST(bst,key);
            scanf("%d",&key);
        }
    }
    
    void inOrder(struct node *root)  //中序遍历二叉排序树,root为根节点指针
    {
        if(root!=NULL)
        {
            inOrder(root->lchild);
            printf("%d ",root->key);
            inOrder(root->rchild);
        }
    }
    
    //在以根指针bst所指的二叉排序树中,递归查找关键字为key的记录
    //查找成功返回该记录节点指针,查找失败返回空指针
    struct node *SearchBST(struct node *bst,int key) 
    {
        if(!bst)
            return NULL;
        else
            if(bst->key==key)
                return bst;
            else
                if(bst->key>key)
                    return SearchBST(bst->lchild,key);
                else
                    return SearchBST(bst->rchild,key);
    }
    
    //在二叉排序树t中删除关键字为k的节点
    struct node *DelBST(struct node *t,int k) 
    {
        struct node *p,*f,*s,*q;
    
        p=t;
        f=NULL;
    
        while(p)  //查找关键字为k的待删除节点p
        {
            if(p->key==k)
                break;
    
            f=p; //f指向p的双亲节点
    
            if(p->key>k)
                p=p->lchild;
            else
                p=p->rchild;
        }
    
        if(p==NULL)
            return t;   //若找不到,返回原二叉排序树
    
        if(p->lchild==NULL)  //若p无左子树
        {
            if(f==NULL)
                t=p->rchild;  //p是原二叉排序树的根
            else
                if(f->lchild==p)    //p是f的左孩子
                    f->lchild=p->rchild;
                else
                    f->rchild=p->rchild;
                
                free(p); //释放被删除的节点
        }
        else
        {
            q=p;
            s=p->lchild;
            while(s->rchild)  //在p的左子树中查找最右下节点
            {
                q=s;
                s=s->rchild;
            }
    
            if(q==p)
                q->lchild=s->lchild; //将s的左子树链到q上
            else
                q->rchild=s->lchild;
            q->key=s->key;
        }
    
        return t;
    }
    
    void main()
    {
        struct node *BST=NULL;
    
        int find_key; //要查找的关键字
        int insert_key; //要插入的关键字
    
        struct node *find_result; //存放查找结果
    
        printf("创建二叉排序树,输入序列(以0为结束标志):
    ");
        CreatBST(&BST);
    
        printf("二叉排序树中序遍历序列如下:
    ");
        inOrder(BST);
    
        printf("输入要查找的关键字:");
        scanf("%d",&find_key);
    
        find_result=SearchBST(BST,find_key);
    
        if(find_result!=NULL)
        {
            printf("要查找的记录存在,值为:%d
    ",find_result->key);
            find_result=DelBST(BST,find_key);;
            printf("查找到的记录被删除后的中序遍历后的序列如下:
    ");
            inOrder(find_result);
        }
        else
            printf("该记录不存在!只能进行插入操作!");
        printf("
    输入要插入的记录的关键字:");
        scanf("%d",&insert_key);
        InsertBST(&BST,insert_key);
        printf("插入新的记录后的中序遍历后的序列如下:
    ");
        inOrder(BST);
    
        system("pause");
    
    
    }
  • 相关阅读:
    .net core 3.1 使用Redis缓存
    JavaSE 高级 第11节 缓冲输入输出字节流
    JavaSE 高级 第10节 字节数组输出流ByteArrayOutputStream
    JavaSE 高级 第09节 字节数组输入流ByteArrayInputStream
    JavaSE 高级 第08节 文件输出流FileOutputStream
    JavaSE 高级 第07节 文件输入流FileInputStream
    JavaSE 高级 第06节 初识I、O流
    JavaSE 高级 第05节 日期类与格式化
    JavaSE 高级 第04节 StringBuffer类
    JavaSE 高级 第03节 Math类与猜数字游戏
  • 原文地址:https://www.cnblogs.com/kkdd-2013/p/3304271.html
Copyright © 2011-2022 走看看