二叉树:二叉排序树

二叉排序树


二叉排序树是一种特殊的二叉树,其 根结点值域 大于左子树中所有结点的值域且 小于右子树中所有结点的值域。

typedef int ElemType;
typedef struct BSTNode{
    ElemType data;
    struct BSTNode *lchild;
    struct BSTNode *rchild;
}BSTNode, *BSTree;

(1) 所有非空左孩子的结点都小于父结点的值

(2) 所有非空右孩子的结点都大于父结点的值

二叉排序树的左右子树也是二叉排序树

性质
  • 中序遍历非空的二叉排序树得到的序列递增有序

二叉排序树的操作-查找

若查找的关键字等于根结点,成功;

否则:若小于根结点,在左子树上查找;若大于根结点,在右子树上查找

在左右子树上重复操作,直至找到。

算法思想
  1. 若二叉排序树为空,则查找失败,返回空指针
  2. 若二叉排序树非空,则给定值与根结点的关键子data进行比较:
  3. 若key = data,则查找成功,返回根结点地址;若 key < data,则进一步查找左子树;若 key > data,则进一步查找右子树
代码描述
BSTree SearchBST(BSTree T,KeyType key){
    if((!T)||key == T->data) return T;
    else if(key < T->data){
        return SearchBST(T->lchild,key);
    }
    else return SearchBST(T->rchild,key);
}
查找分析

查找某关键字等于给定值结点的过程,其实是走了一条从根到该结点的路径

比较的关键字次数 = 此结点所在层数 (最多不超过树的深度)

平均查找长度 = (1+2+2+3+3+3)/6 = 14/6

在这里插入图片描述

二叉排序树的操作-插入

在这里插入图片描述

算法思想:

  • 若二叉排序树为,则插入结点作为根结点插入到空树中
  • 否则,继续在左、右子树上查找;若树中已有,不再插入
  • 若树中没有,查找至某个叶子结点的左子树或右子树为空为止,则插入结点应为该叶子节点的左孩子或右孩子

插入的元素一定在叶结点

二叉排序树的操作-删除

从二叉排序树中删除一个结点,不能把以该结点为根的子树都删去,只能删掉该结点,并且还应保证删除后所得的二叉树仍然满足二叉排序树的性质不变。

删除叶子结点

直接删去该结点

其双亲结点的相应指针域的值改为”空“

只有左子树或右子树

被删除的结点只有左子树或只有右子树时,用其左子树或右子树替换它(结点替换)

在这里插入图片描述

既有左子树又有右子树
  • 用其中序的前趋值替换之,然后再删除该前趋结点

前趋结点是左子树中最大的结点

  • 也可用其中序的后继值替换之,然后再删除该后继结点

后继是右子树中最小的结点

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值