查找之二:二叉排序树

先说一下定义(尽管大家后知道…………)~!~
二叉排序树(Binary Sort Tree),又称为二叉查找树。它或者是一颗空树,或者是具有以下性质的二叉树:

  • 若它的左子树不空,则左子树上所有结点的均小于它的根结点的值;
  • 若它的右子树不空,则右子树上所有结点的均大于它的根结点的值;
  • 它的左右子树也分别为二叉排序树。

其实,上面使用了递归定义,是不是也暗示着我们的查找程序也将使用递归呢?看看下面的代码吧~~

1. 二叉排序树查找

//首先我们先提供一个二叉链表结点结构定义
typedef struct BiTNode{//结点结构
    int data;//结点数据
    struct BiTNode *lchild,*rchild;//左右孩子指针
}BiTNode,*BiTree;

然后我们来看看如何实现查找吧

//递归查找而茶排序树T中是否存在,key
//指针f指向T的双亲,其初始调用值为NULL
//若查找成功,则指针p指向该数据元素结点,并返回false;
//若指针p指向查找路径上访问的最后一个结点并返回FAlse

bool searchBST(BiTree T,int key,BiTree f,BiTree* p){
    if(!T){
        *p = f;
        return false;
    }else if(key ==  T->data){
        *p = T;
        return true;
    }else if(key < T->data){
        return searchBST(T->lchild,key,T,p);
    }else 
        return searchBST(T->rchild,key,T,p);
}
//可以看到递归的写法确实很简洁~~

2.二叉排序树的插入操作
其实就是将关键字放到合适的位置而已~~

//当二叉排序树T中不存在关键字等于key的数据元素时
//输入key并返回true,否则返回false
bool insertBST(BiTree* T,int key){
    BiTree p,s;
    if(!searchBST(*T,key,NULL,&p)){//查找不成功
        s = (BiTree)malloc(sizeof(BiTNode));
        s->data = key;
        s->lchild = s->rchild = NULL;
        if(!p){    //这里p指向访问的最后一个结点
            &T = s;//插入s为根结点
        }else if(key < p->data){
            p->lchild = s;
        }else 
            p->rchild = s;

        return true;
    }else
        return false;
}

3.创建二叉排序树
创建无非就是把数据insert的过程~~

void createBST(const int* arr,const int len){
    int i ;
    BiTree T = NULL;
    for(i=0;i < len;i++){
        insertBST(&T,arr[i]);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值