查找之二叉搜索树

一.查找

1.静态查找与动态查找
  • 动态查找是对数据进行更改,而静态查找对数据不进行更改

二. 二叉搜索树

2.1性质:
  • 若他的左子树不空,则左子树上所有结点的值均小于它的根节点的值
  • 若它的右子树不空,则右子树上所有结点的值均大于它根节点的值
  • 它的左右子树也都是二叉排序树
2.2创建二叉搜索树
typedef struct node
{
    int data;
    struct node*lchild;
    struct node*rchild;
}BSTnode;
typedef struct BST
{
    BSTnode*root;
}BST;
// int arr[]={45,12,53,3,37,100,25,61,90,78};
void init(BST* b)
{
    b->root=NULL;
}
bool insert(BSTnode**t,int x)//传入根节点的地址
{
    if(*t!=NULL)
    {
        *t=(BSTnode*)malloc(sizeof(BSTnode));
        *t->data=x;
        *t->lchild=NULL;
        *t->rchild=NULL;
        return true;
    }
    else if(x<(*t)->data)
    {
        insert(&((*t)->lchild),x);
    }
    else if(x>(*t)->data)
    {
        insert(&((*t)->rchild),x);
    }
    return false;
}
2.3得到最大最小值
int min(BSTnode*t)//最小值就是最小的左子树
{
    while(t->lchild!=NULL)
    {
        t=t->lchild;
    }
    return t->data;
}
int max(BSTnode*t)//最大值就是最右边右子树
{
    while(t->rchild!=NULL)
    {
        t=t->rchild;
    }
    return t->data;
}
2.4排序
void sort(BSTnode*t)//相当于对树进行中序遍历
{
    if(t!=NULL)
    {
        sort(t->lchild);
        printf("%d ",t->data);
        sort(t->rchild);
    }
}
2.5删除某个数
bool removeBST(BSTnode**t,int key)
{
    if(*t==NULL)
        return false;
        //先通过递归找到要删除的值的节点
    if(key<(*t)->data)
        removeBST(&(*t)->lchild,key);
    else if(key>(*t)->data)
        removeBST(&(*t)->rchild,key);
    else
    {
        BSTnode*p;
        if((*t)->lchild==NULL&&(*t)->rchild==NULL)//第一种情况:该节点没有子树,就直接删除
        {
            free(*t);
            *t=NULL;
        }
        else if((*t)->lchild!=NULL&&(*t)->rchild==NULL)//第二种情况:该节点有左子树或者右子树,将右子树或者左子树接到该节点位置上,
                                                            //再将该节点删除
        {
            p=*t;
            *t=(*t)->lchild;
            free(p);
            p=NULL;
        }
        else if((*t)->rchild!=NULL&&(*t)->lchild==NULL)
        {
             p=*t;
            *t=(*t)->rchild;
            free(p);
            p=NULL;
        }
        else//第三种情况:该节点既有左子树又有右子树,将该节点右子树中的最后一个无子树的树的值赋给该节点,再删除那个无子树的树
        {
            p=(*t)->rchild;
            while(p->lchild!=NULL)
            {
                p=p->lchild;
            }
            (*t)->data=p->data;
            removeBST(&(*t)->rchild,p->data);
        }
    }
    return true;
}
2.6 查找节点
BSTnode* search(BST*t,key)
{
    if(t==NULL)
        return NULL;
    if(t->data==key)
        return t;
    if(key<t->data)
       return  search(t->lchild,key);//查找到后直接返回节点
    else 
      return  search(t->rchild,key);
}
2.7 对树置空
void makeEmpty(BSTnode**t)
{
    if((*t)!=NULL)
    {
        makeEmpty(&((*t)->lchild));
        makeEmpty(&((*t)->rchild));
        free(*t);
        *t=NULL;
    }
}
2.8二叉排序树的特性
  • 查找次数不超过树的深度
  • 二叉排序树的形态尤为重要,与查找效率有关,因此需要将二叉树平衡化
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值