二叉排序树总结

二叉排序树的定义

二叉排序树或者是一棵空树,或者是具有下列性质的二叉树:

  • 左子树上所有结点的值均小于根结点的值;
  • 右子树的所有结点的值均大于根结点的值;
  • 他的左右子树也分别都是二叉排序树;

二叉排序树的查找过程

  • 首先和根结点的值进行比较,若相等,则返回成功,返回结点位置
  • 若小于根节点的值,则继续在其左子树上查找;
  • 若大于根结点的值,则继续在其右子树上查找;
  • 直至查找成功或者查找失败。

查找成功:走了一条从二叉排序树的根到对应结点的路径。
查找失败:从二叉排序树的根到路径末端。

二叉排序树的插入

  • 查找失败时,插入新结点。
  • 新结点为查找失败时查找路径上访问的最后一个结点的左孩子或右孩子,只需要修改指针;
  • 新结点为叶子结点。

在这里插入图片描述

二叉排序树的建立

在查找过程中建立,初始为空二叉树,每次查询失败时,就插入新结点。
注意:二叉排序树在不断变化,且数据元素的输入顺序不同,得到的二叉排序树形态也不同。
在这里插入图片描述
在这里插入图片描述

二叉排序树的删除

删除需要视情况而定:

  1. 如果要删除的*p为叶子:删除此结点时,修改*f(*p的双亲)的lchild或者rchild为null;

  2. *p只有一棵子树(或左或右):令PL或者PR代替*p称为*f的孩子;
    3.*p有两棵子树:
    设删除前中序遍历的序列为:

    ...S   P   PR....//P的直接前驱是s
    

    希望删除P后,其他元素的相对位置不变。
    在这里插入图片描述
    如图所示:要删除P结点,且要保持删除后依然为AVL

    有两种方法:

    1. *p的左子树代替*p成为f的左子树,*p的右子树为s的右子树;
      在这里插入图片描述

    2. *s代替*p(以*p的直接前驱或者直接后继代替他)//*s为*p左子树最右下的结点
      在这里插入图片描述

二叉排序树查找分析

二叉排序树上查找某关键字等于给定值得结点过程,其实就是走了一条从根到该结点的路径。

二叉排序树的平均查找长度
在这里插入图片描述
其中ni是每层结点的个数;
Ci是结点所在的层次;
m为树高度。

最好情况:与折半查找中的判定树相同(形态比较均衡),即高度等于具有相同结点数的完全二叉树的高度
最坏情况:即插入的n个元素从一开始就有序,一变成单支树的形态!
( 此时树的深度为n;
ASL= (n+1)/2
查找效率与顺序查找情况相同。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值