二叉排序树——课后练

在这里插入图片描述

#include <stdio.h>
#include <stdlib.h>
//数据结构定义
struct node
{
    int data ;
    struct node *lchild ,*rchild ;
};

typedef struct node *pTree;
/*第一关*/


/*1.创建一个二叉树结点,值为element*/
pTree createTreeNode(int element)
{
    pTree node = (pTree)malloc(sizeof(struct node));
    node->data = element;
    node->lchild = NULL;
    node->rchild = NULL;
    return node;
}

/*2.在二叉排序树中插入一个数据元素,若二叉树为空,则新建根节点*/
pTree insertData(int x , pTree T)
{
    if(T==NULL){
        T = createTreeNode(x);
        return T;
    }
    pTree p = T;
    
    while(1){
        if(x<=p->data&&p->lchild==NULL){
            p->lchild = createTreeNode(x);
            return T;
        }
        else if(x>p->data&&p->rchild==NULL){
            p->rchild = createTreeNode(x);
            return T;
        }

        if(x<p->data) p  = p->lchild;
        else p = p->rchild;
        }
    return T;
}

/*3.先序遍历和中序遍历函数*/
void preOrder( pTree T)
{
    if(T==NULL) return;
    
    printf("%d ",T->data);
    preOrder(T->lchild);
    preOrder(T->rchild);

}
void inOrder( pTree T)
{
    if(T==NULL)return;
    inOrder(T->lchild);
    printf("%d ",T->data);
    inOrder(T->rchild);
}

int main()
{
int a ,num;

pTree T =NULL;
 scanf("%d",&num);
for(int i=0;i<num;i++)
 {
     scanf("%d",&a);
     T = insertData(a, T);
 }
 inOrder(T);
 printf("\n");
 preOrder(T);

}

在这里插入图片描述

#include <stdio.h>
#include <stdlib.h>
//数据结构定义
struct node
{
    int data ;
    struct node *lchild ,*rchild ;
};

typedef struct node *pTree;
/*第一关*/


/*1.创建一个二叉树结点,值为element*/
pTree createTreeNode(int element)
{
    pTree node = (pTree)malloc(sizeof(struct node));
    node->data = element;
    node->lchild = NULL;
    node->rchild = NULL;
    return node;
}

/*2.在二叉排序树中插入一个数据元素,若二叉树为空,则新建根节点*/
pTree insertData(int x , pTree T)
{
    if(T==NULL){
        T = createTreeNode(x);
        return T;
    }
    pTree p = T;
    
    while(1){
        if(x<p->data&&p->lchild==NULL){
            p->lchild = createTreeNode(x);
            return T;
        }
        else if(x>p->data&&p->rchild==NULL){
            p->rchild = createTreeNode(x);
            return T;
        }
        if(x==p->data) return T;
        if(x<p->data) p  = p->lchild;
        else p = p->rchild;
        }
    return T;
}

/*3.先序遍历和中序遍历函数*/
void preOrder( pTree T)
{
    if(T==NULL) return;
    
    printf("%d ",T->data);
    preOrder(T->lchild);
    preOrder(T->rchild);

}
void inOrder( pTree T)
{
    if(T==NULL)return;
    inOrder(T->lchild);
    printf("%d ",T->data);
    inOrder(T->rchild);
}


/*第二关*/
/*1.在二叉排序树T中查找最小值,返回该结点*/
pTree findMin(pTree T)
{
    if(T==NULL)return T;
    
    while(1){
        if(T->lchild!=NULL){
            T = T->lchild;
        }else return T;
    }

    return T;
}

/*2.在二叉排序树T中查找最大值,返回该结点*/
pTree findMax(pTree T)
{
    if(T==NULL)return T;
    
    while(1){
        if(T->rchild!=NULL) T = T->rchild;
        else return T;
    }

    return T;

}


/*3.在二叉排序树T中查找指定数据元素,若未找到,则返回NULL*/
pTree findData(pTree T, int element)
{
    while(1){
        if(T==NULL)return T;
        if(element<T->data) T = T->lchild;
        else if(element>T->data) T = T->rchild;
        else if(element==T->data) return T;
    }

    return T;
}

int main()
{
int a ;

pTree T =NULL;
int num;
scanf("%d",&num);
for(int i=0;i<num;i++)
 {
     scanf("%d",&a);
     T = insertData(a, T);
 }
 pTree p = findMin(T);
 if(p)
printf("%d\n",p->data);
else
printf("未找到\n");
p = findMax(T);
if(p)
printf("%d\n",p->data);
else
printf("未找到\n");

scanf("%d",&a);
p = findData(T,a);
if(p)
printf("%d\n",p->data);
else
printf("未找到指定元素\n");


}

在这里插入图片描述

这题没有完全实现好,完全面向结果编程了,数据量一大应该就过不了,但是这题头歌是可以过的,不大想搞这个了,今天有点摆,心情烦躁。

#include <stdio.h>
#include <stdlib.h>
//数据结构定义
struct node
{
    int data ;
    struct node *lchild ,*rchild ;
};

typedef struct node *pTree;
/*第一关*/


/*1.创建一个二叉树结点,值为element*/
pTree createTreeNode(int element)
{
    pTree node = (pTree)malloc(sizeof(struct node));
    node->data = element;
    node->lchild = NULL;
    node->rchild = NULL;
    return node;
}

/*2.在二叉排序树中插入一个数据元素,若二叉树为空,则新建根节点*/
pTree insertData(int x , pTree T)
{
    if(T==NULL){
        T = createTreeNode(x);
        return T;
    }
    pTree p = T;
    
    while(1){
        if(x<p->data&&p->lchild==NULL){
            p->lchild = createTreeNode(x);
            return T;
        }
        else if(x>p->data&&p->rchild==NULL){
            p->rchild = createTreeNode(x);
            return T;
        }
        if(x==p->data) return T;
        if(x<p->data) p  = p->lchild;
        else p = p->rchild;
        }
    return T;
}

/*3.先序遍历和中序遍历函数*/
void preOrder( pTree T)
{
    if(T==NULL) return;
    
    printf("%d ",T->data);
    preOrder(T->lchild);
    preOrder(T->rchild);

}
void inOrder( pTree T)
{
    if(T==NULL)return;
    inOrder(T->lchild);
    printf("%d ",T->data);
    inOrder(T->rchild);
}


/*第二关*/
/*1.在二叉排序树T中查找最小值,返回该结点*/
pTree findMin(pTree T)
{
    if(T==NULL)return T;
    
    while(1){
        if(T->lchild!=NULL){
            T = T->lchild;
        }else return T;
    }

    return T;
}

/*2.在二叉排序树T中查找最大值,返回该结点*/
pTree findMax(pTree T)
{
    if(T==NULL)return T;
    
    while(1){
        if(T->rchild!=NULL) T = T->rchild;
        else return T;
    }

    return T;

}


/*3.在二叉排序树T中查找指定数据元素,若未找到,则返回NULL*/
pTree findData(pTree T, int element)
{
    while(1){
        if(T==NULL)return NULL;
        if(element<T->data) T = T->lchild;
        else if(element>T->data) T = T->rchild;
        else if(element==T->data) return T;
        if(T==NULL)return NULL;
    }

    return T;
}

pTree findDataFather(pTree T,int element){
    while(1){
        if(T==NULL)return NULL;
        if(T->data > element){
            if(T->lchild!=NULL)
                if(T->lchild->data==element) return T;
            T = T->lchild;
        }
        if(T->data < element){
            if(T->rchild!=NULL)
                if(T->rchild->data==element) return T;
            T = T->rchild;
        }
    }
}

/*第三关*/
//在二叉排序树T中
pTree deleteData(pTree T,int element)
{
    pTree p = findData(T, element);
    if(p==NULL)return NULL;
    
    if(T->data==element){
        T->data = T->rchild->data;
        T->rchild = T -> rchild -> rchild;
        return T;
    }
    pTree q = findDataFather(T, element);
    q -> rchild = p->rchild;
    return T;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小蒋的学习笔记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值