6.3二叉排序树

6.3二叉排序树

定义:二叉排序树(Binary Search Tree也叫二叉搜索树)或者是空树或者是具有以下性质的二叉树;(左小右大)

1)若左子树不空,则左子树上的所有结点的值均小于它的根结点的值。

2)若右子树不空,则右子树上的所有结点的值均大于它的根结点的值。

3)它的左右子树也是一颗二叉排序树。

[外链图片转存失败(img-MZLnA2AX-1567153420409)(C:\Users\liuhao\AppData\Roaming\Typora\typora-user-images\1567151291577.png)]

对二叉排序树进行中序遍历可以得到一个递增的有序序列。

二叉排序树的目的,不是为了排序,而是为了提高查找和插入关键字的速度(有序,树型结构)

1查找关键字代码:

//递归代码
BiTNode *BFS_Search(BiTNode *t,ElemType key){
	if(t==NULL)
        return NULL;  //树为空返回空值
    else{
        if(t->key==key)
            return t;
        else if(key<t->key)
            return BFS_Search(t->lchild,key);
        else
            return BFS_Search(t->rchild,key);
    }
}

//非递归代码
BiTNode *BFS_Search(BiTNode *t,ElemType key){
	BiTNode *p=t;
    while(p!=NULL&&Key!=p->data){//p不为空且没找到key
        if(key<p->data)
            p=p->lchild;
        else
            p=p->rchild;
    }
    return p;
}

2.二叉排序树插入关键字代码:

1)空树:直接插入新结点返回成功。

2)树不空:检查是否存在关键字重复的结点;

@存在;返回插入失败

@不存在:检查根结点的值和待插入关键字的大小关系递归插入左右子树。

int BFS_Insert(BiTNode*&t,ElemType k){ //插入操作是对树进行修改,所以用引用类型的指针
    if(t ==NULL){
		t=(BiTNode*)malloc(sizeof(BiTNode));
        t->key=k;
        t->lchild=t->rchild=NULL;
        return 1;
    }
    else if(k==t->key)
        return 0
    else if(k<t->key)
        return  BFS_Insert(t->lchild,k);
    if(k>t->key)
        return  BFS_Insert(t->rchild,k);

}

3.二叉排序树构造代码:

构造二叉排序树的过程可以理解成从一棵空树开始,依次插入二叉排序树的 结点

void Creat_BFS(BiTNode *&t,ElemType key[],int n){
    //t是二叉排序树的根结点指针,key是关键字数组,n是关键字数目
    t=NULL;  //初始化t为空树
    int i=0;
    while(i<n){
        BFS_Insert(t,key[i]);
        i++;
    }   
}

4.二叉排序树删除结点

1)删除的是叶子结点

2)删除的仅有左子树或者右子树的结点

3)删除的是左右子树都得结点

[外链图片转存失败(img-TQRf0zx3-1567153420410)(assets/1567152838227.png)]

[外链图片转存失败(img-EUIOnJGC-1567153420410)(assets/1567152857539.png)]错误的:

[外链图片转存失败(img-zTnd4Y6A-1567153420410)(assets/1567152895015.png)]

正确的:

前驱结点:左孩子中关键字最大的结点

后继结点:有孩子中关键字最小的结点

[外链图片转存失败(img-dPhz4JwF-1567153420411)(assets/1567153158711.png)]

[外链图片转存失败(img-BHZxAsMF-1567153420412)(assets/1567153186447.png)]

二叉排序树的性能分析:

[外链图片转存失败(img-VmMmNLVo-1567153420413)(assets/1567153245197.png)]

最好的情况就是向左上图这种完全二叉树,这种情况下查找的时间复杂度为O(logn)。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值