zoukankan      html  css  js  c++  java
  • 二叉排序树 算法实验

    /*实现二叉排序树上的查找算法。具体实现要求:
    1.    用二叉链表做存储结构,输入键值序列,建立一棵二叉排序树。
    2.    用广义表表示所建二叉树。
    3.    按中序遍历这棵二叉排序树。
    4.    在二叉排序树上插入结点。
    5.    删除二叉排序树上的结点。
    6.    在二叉排序树上实现查找算法。*/
    
    
    #include <stdio.h>
    #include <stdlib.h>
    typedef int InfoType;
    
    typedef int KeyType;            //假定关键字类型为整数
    typedef struct node                //结点类型
    {
        KeyType key;                //关键字项
        InfoType otherinfo;            //其它数据域,InfoType视应用情况而定 下面不处理它
        struct node *lchild,*rchild;//左右孩子指针
    }BSTNode;
    typedef BSTNode *BSTree;        //BSTree是二叉排序树的类型
    
    void main()
    {
        void InsertBST(BSTree *Tptr,KeyType key);    //将关键字key插入二叉排序树中
        BSTree CreateBST(void);            //建立二叉排序树
        void ListBinTree(BSTree T);        //用广义表表示二叉树
        void DelBSTNode(BSTree Tptr,KeyType key);    //在二叉排序树中删除关键字key
        BSTNode *SearchBST(BSTree T,KeyType key);    //在二叉排序树中查找关键字key
        
        BSTree T;
        BSTNode *p;
        int key;
        
        
        printf("请输入关键字(输入0为结束标志):
    ");
        T=CreateBST();
        ListBinTree(T);
        printf("
    ");
        printf("请输入欲插入关键字:");
        scanf("%d",&key);
        InsertBST(&T,key);
        ListBinTree(T);
        printf("
    ");
        printf("请输入欲删除关键字:");
        scanf("%d",&key);
        DelBSTNode(T,key);
        ListBinTree(T);
        printf("
    ");
        printf("请输入欲查找关键字:");
        scanf("%d",&key);
        p=SearchBST(T,key);
        if(p==NULL)
            printf("没有找到%d!
    ",key);
        else
            printf("找到%d!
    ",key);
        ListBinTree(p);
        printf("
    ");
    }
    
    //将关键字key插入二叉排序树中
    void InsertBST(BSTree *T,KeyType key)
    {
        
        BSTNode *p,*q;
        if((*T)==NULL)
        {
            (*T)=(BSTree)malloc(sizeof(BSTNode));
            (*T)->key=key;
            (*T)->lchild=(*T)->rchild=NULL;
        }
        else
        {
            p=(*T);
            while(p)
            {
                q=p;
                if(p->key>key)
                    p=q->lchild;
                else if(p->key<key)
                    p=q->rchild;
                else
                {
                    printf("
    该二叉排序树中含有关键字为%d的结点
    ",key);
                    return;
                }
            }
            p=(BSTree)malloc(sizeof(BSTNode));
            p->key=key;
            p->lchild=p->rchild=NULL;
            if(q->key>key)
                q->lchild=p;
            else
                q->rchild=p;
        }
    }
    
    //建立二叉排序树
    BSTree CreateBST(void)
    {
        
        BSTree T = NULL;
        KeyType key;
        scanf("%d",&key);
        while(key)
        {
            InsertBST(&T,key);
            scanf("%d",&key);
        }
        return T;
    }
    
    //在二叉排序树中删除关键字key
    void DelBSTNode(BSTNode *Tptr,KeyType key)
    {
       
    
        BSTNode *f,*p=Tptr;
        while(p&&p->key!=key)//查找值为x的结点
        {
            if(p->key>key)
            {
                f=p;p=p->lchild;
            }
            else
            {
                f=p;p->rchild;
            }
        }
        if(p==NULL) {printf("没找到");return ;}//没找到
        if(p->lchild==NULL)//被删结点没有左子树,直接将右子树接到其双亲上
        {
            if(f->lchild==p)f->lchild=p->rchild;
            else f->rchild=p->rchild;
            return ;
        }
        else//被删结点有左子树
        {
            BSTNode *q=p->lchild,*s=q;
            while(q->rchild!=NULL)//查找左子树最右下的结点(中序最后结点)
            {
                s=q;q=q->rchild;
            }
            if(s==p->lchild)//p左子树的根结点无右子女
            {
                p->key=s->key;
                p->lchild=s->lchild;
                free(s);
                return ;
                
            }
            else
            {
                p->key=q->key;
                s->rchild=q->lchild;
                free(q);//删除q结点
                return ;
            }
        }
    
    }
    
    
    //用广义表表示二叉树
    void ListBinTree(BSTree T)
    {
        //在此插入必要的语句
        if(T!=NULL)
        {
            printf("%d",T->key);
            if(T->lchild!=NULL||T->rchild!=NULL)
            {
                printf("(");
                ListBinTree(T->lchild);
                if(T->rchild!=NULL)
                    printf(",");
                ListBinTree(T->rchild);
                printf(")");
            }
        }
    }
    
    //在二叉排序树中查找关键字key
    BSTNode *SearchBST(BSTree T,KeyType key)
    {
        //在此插入必要的语句
        if(T==NULL||key==T->key)
            return T;
        if(key<T->key)
            return SearchBST(T->lchild,key);
        else 
            return SearchBST(T->rchild,key);
    }


    感觉很难  做的太少了吧

  • 相关阅读:
    【BZOJ2329】括号修复(splay)
    连接数据库
    文件锁
    带进度条的输入流
    文件对话框
    使用Scanner来解析文件
    IO流(数据流
    IO流(随机流,数组内存流
    IO流文件字符输入输出流,缓冲流
    IO流(文件字节输入输出
  • 原文地址:https://www.cnblogs.com/loveincode/p/3741558.html
Copyright © 2011-2022 走看看