二叉排序树

概念

二叉排序树是一种动态树表。特点是树的结构不是一次生成的,而是在查找的整个过程中,当树中不存在给定关键字等于给定的值的时候在进行插入。新插入的节点一定是一个新添加的用户的节点。

方法实现

定义节点信息

typedef struct BSTNode
{
    T data;
    BSTNode *leftChild;
    BSTNode *rightChild;
}BSTNode;

插入节点

BOOL InsertBSTree(BSTNode **t, T x)
{
    //头结点是空的话
    if((*t) == NULL){
        *t= (BSTNode *)malloc(sizeof(BSTNode));
        (*t)->data = x;
        (*t)->leftChild = NULL;
        (*t)->rightChild = NULL;
        return TRUE;
    }else if(x > (*t)->data){
        InsertBSTree(&(*t)->leftChild, x);
    }else if(x < (*t)->data){
        InsertBSTree(&(*t)->rightChild, x);
    }
    return FALSE;//相同的话就不进行插入
}

排序

void Sort(BSTNode *t)
{
    if(t != NULL){
        Sort(t->leftChild);
        printf("%d ", t->data);
        Sort(t->rightChild);
    }
}

查找

BSTNode* Search(BSTNode *t, T key)
{
    if(t == NULL || t->data == key)
        return t;
    if(key < t->data)//在左孩子找
        return Search(t->leftChild, key);
    if(key > t->data)
        return Search(t->rightChild, key);
}

删除

//删除一个节点
BOOL RemoveBSTree(BSTNode **t, T key)
{
    if(*t == NULL){
        return FALSE;
    }
    //如果没有找到就继续找
    if(key < (*t)->data)
        RemoveBSTree(&(*t)->leftChild, key);
    else if(key > (*t)->data)
        RemoveBSTree(&(*t)->rightChild, key);
    else{
        //这是找到的情况
        BSTNode *p = NULL;
        //找到的要删除的节点都有左子树和右子树
        if((*t)->leftChild != NULL && (*t)->rightChild != NULL){
            p = (*t)->rightChild; 
            while(p->leftChild != NULL)
                p = p->leftChild;
            (*t)->data = p->data; //找到最小的点,并且赋值给要删除的点。
            RemoveBSTree(&(*t)->rightChild, p->data);
        }else{
            p = *t;
            if((*t)->leftChild == NULL) //左孩子是空
                (*t) = (*t)->rightChild; //指向右孩子
            else
                (*t) = (*t)->leftChild;
            free(p);
            p = NULL;
        }
    }
}

性能分析

在二叉排序树上查找其关键字等于给定值的节点的过程,是一条根节点到该节点路径的过程,和给定值比较的关键字的关键字个数等于节点所在的层次数。比较的次数不会超过树的深度。
数据一样,不同的二叉树的比较次数不一样。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值