二叉排序树 算法实验

简介:
复制代码
复制代码
/*实现二叉排序树上的查找算法。具体实现要求:
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为结束标志):\n");
    T=CreateBST();
    ListBinTree(T);
    printf("\n");
    printf("请输入欲插入关键字:");
    scanf("%d",&key);
    InsertBST(&T,key);
    ListBinTree(T);
    printf("\n");
    printf("请输入欲删除关键字:");
    scanf("%d",&key);
    DelBSTNode(T,key);
    ListBinTree(T);
    printf("\n");
    printf("请输入欲查找关键字:");
    scanf("%d",&key);
    p=SearchBST(T,key);
    if(p==NULL)
        printf("没有找到%d!\n",key);
    else
        printf("找到%d!\n",key);
    ListBinTree(p);
    printf("\n");
}

//将关键字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("\n该二叉排序树中含有关键字为%d的结点\n",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);
}
复制代码

 

复制代码


感觉很难  做的太少了吧

目录
相关文章
|
4月前
|
算法
2017级《算法设计与分析》--实验1--分治算法-骨牌铺方格
2017级《算法设计与分析》--实验1--分治算法-骨牌铺方格
|
4月前
|
算法
2017级《算法设计与分析》--实验1--分治算法
2017级《算法设计与分析》--实验1--分治算法
|
11月前
|
存储 算法 C语言
C语言---数据结构实验---哈夫曼树及哈夫曼编码的算法实现---图的基本操作
C语言---数据结构实验---哈夫曼树及哈夫曼编码的算法实现---图的基本操作
|
4月前
|
机器学习/深度学习 数据采集 算法
【机器学习】基于机器学习的分类算法对比实验
【机器学习】基于机器学习的分类算法对比实验
94 6
【机器学习】基于机器学习的分类算法对比实验
|
1月前
|
算法 Java 测试技术
算法分析(蛮力法与减治算法应用实验报告)
这篇文章是关于算法分析的实验报告,介绍了如何使用蛮力法解决背包问题,并通过伪代码和Java代码实现,同时分析了其时间效率;还介绍了基于减治法思想实现的二叉查找树的插入与查找,同样提供了伪代码、Java源代码实现和时间效率分析,最后展示了测试结果截图。
算法分析(蛮力法与减治算法应用实验报告)
|
1月前
|
机器学习/深度学习 算法 Java
算法设计(动态规划应用实验报告)实现基于贪婪技术思想的Prim算法、Dijkstra算法
这篇文章介绍了基于贪婪技术思想的Prim算法和Dijkstra算法,包括它们的伪代码描述、Java源代码实现、时间效率分析,并展示了算法的测试用例结果,使读者对贪婪技术及其应用有了更深入的理解。
算法设计(动态规划应用实验报告)实现基于贪婪技术思想的Prim算法、Dijkstra算法
|
1月前
|
算法 Java 测试技术
算法设计(动态规划实验报告) 基于动态规划的背包问题、Warshall算法和Floyd算法
这篇文章介绍了基于动态规划法的三种算法:解决背包问题的递归和自底向上实现、Warshall算法和Floyd算法,并提供了它们的伪代码、Java源代码实现以及时间效率分析。
算法设计(动态规划实验报告) 基于动态规划的背包问题、Warshall算法和Floyd算法
|
1月前
|
算法 搜索推荐
算法设计 (分治法应用实验报告)基于分治法的合并排序、快速排序、最近对问题
这篇文章是关于分治法应用的实验报告,详细介绍了如何利用分治法实现合并排序和快速排序算法,并探讨了使用分治法解决二维平面上的最近对问题的方法,包括伪代码、源代码实现及时间效率分析,并附有运行结果和小结。
|
4月前
|
算法 测试技术 编译器
【算法 | 实验18】在字符矩阵中查找给定字符串的所有匹配项
题目描述 题目 在字符矩阵中查找给定字符串的所有匹配项 给定一个M×N字符矩阵,以及一个字符串S,找到在矩阵中所有可能的连续字符组成的S的次数。所谓的连续字符,是指一个字符可以和位于其上下左右,左上左下,右上右下8个方向的字符组成字符串。用回溯法求解。
78 1
|
4月前
|
算法 图形学
【计算机图形学】实验一 DDA算法、Bresenham算法
【计算机图形学】实验一 DDA算法、Bresenham算法
105 3