二叉排序树创建和插入

 本关任务:实现二叉排序树结点创建和数据插入函数。并完成中序和先序遍历函数,通过输出结果验证二叉排序树是否正确创建。

#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 p= (struct node*)malloc(sizeof(struct node));

    p->data = element;
    p->lchild = NULL;
    p->rchild = NULL;
    return p;
}

/*2.在二叉排序树中插入一个数据元素,若二叉树为空,则新建根节点*/
pTree insertData(int x , pTree T)
{
    pTree node = createTreeNode(x);
    if(T == NULL)return node;

    pTree p = T,q = T;
    while(q != NULL){//遍历寻找能够插入的位置
        if(q->data == x)return T;
        if(q->data > x){//x偏小 向左子树遍历
            p = q;
            q = q->lchild;
        }else{//x偏大 向右子树遍历
            p = q;
            q = q->rchild;
        }
    }   

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

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


}
void inOrder( pTree T)//先遍历左子树,然后输出根,再遍历右子树
{
    if(T == NULL)return ;
    inOrder(T->lchild);
    printf("%d ",T->data);
    inOrder(T->rchild);
    return;
}


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

}

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


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

/*第三关*/
/*在二叉排序树T中删除指定元素的结点,若删除成功则返回该结点,否则返回NULL*/
pTree deleteData(pTree T,int element)
{
    if(T == NULL || findData(T, element) == NULL) return NULL;
    if(T -> data == element)
    {
        if(T -> rchild != NULL)
        {
            pTree r = T -> rchild;
            findMin(r) -> lchild = T -> lchild;
            T -> data = r -> data;
            T -> rchild = r -> rchild;
            T -> lchild = r -> lchild;
            free(r);
            return T;
        }
        else if(T -> lchild != NULL)
        {
            pTree r = T -> lchild;
            findMax(r) -> rchild = T -> rchild;
            T -> data = r -> data;
            T -> rchild = r -> rchild;
            T -> lchild = r -> lchild;
            free(r);
            return T;
        }
        else return NULL;
    }
    else if(T -> data > element)
    {
        T -> lchild = deleteData(T -> rchild, element);
    }
    else
    {
        T -> rchild = deleteData(T -> rchild, element);
    }
    return T;
}




  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值