二叉查找树BST简单回顾

概念

二叉查找树(Binary Search Tree),又称二叉排序树,二叉搜索树,是一种二叉树数据结构,满足以下性质:

  1. 左子树结点值<根结点值<右子树结点值(左子树所有节点的值均小于根节点的值,右子树所有节点的值均大于根节点的值)。
  2. 左子树和右子树也分别为二叉查找树,即满足上述1性质。
  3. 由于1性质,可以知道对该树进行中序遍历可以得到一个递增的有序序列。

树的遍历方式分为两种

  • 深度优先搜索遍历(dfs):1、前序遍历(前根遍历):根左右;2、中序遍历(中根遍历):左根右;3、后序遍历(后根遍历):左右根。
  • 广度优先搜索遍历 (bfs)

二叉查找树BST简单回顾_第1张图片

上述就是一个二叉查找树,由其性质1我们可以很方便地去查找结点。

查找

通过比较当前结点的关键字与待查找结点的关键字,如果相同,则查找成功;如果比当前结点关键字小,则往左子树下继续查找;如果比当前结点关键字大,则往右子树下继续查找;若最后查找到的结点为null,则说明查找失败。比如:在上述二叉查找树中查找25

二叉查找树BST简单回顾_第2张图片

查找长度

查找过程中需要对比的关键字的次数。(以下计算均以上述二叉查找树为例进行计算)

查找成功的平均查找长度ASL(Average Search Length)=(1*1+2*2+3*3+4*2+5*1)/ 8 = 3.375(查找成功,则必定在该树的结点上,对于第一层的1个结点,查找成功,需对比1次关键字,即根的值;对于第二层的2个结点,查找成功需要对比2次关键字,即根与第二层的某个结点......计算平均值,则把所有次数加起来再除以总结点数8即可)。

二叉查找树BST简单回顾_第3张图片

查找失败的平均查找长度ASL =(2*1+3*4+4*3+5*2)/ 10 = 3.6(建议给它补全每个结点的左右空孩子(为了方便画出来而已,实际是不占空间的)查找长度指的是查找过程中对比关键字的次数,所以,对于处于第三层的查找失败的结点,即null,共1个,需对比2次关键字;对于处于第四层的查找失败的结点,共4个,需对比3次关键字......最后再除以查找失败的10个结点即可)。

插入

插入与查找很相似,通过左子树结点值<根结点值<右子树结点值,来决定是左子树还是右子树。当发现值相同时,不做任何操作直接结束;当发现第一个null指针时,插入该位置。

删除

删除结点时可能会破坏二叉查找树的特性,所以一般需要对其进行删除后调整。

  1. 如果要删除结点是叶子结点,则直接删除。
  2. 如果要删除的结点仅有左子树或右子树,则直接删除,让其子树替代原位置即可。
  3. 如果要删除结点的左、右子树均存在:1)、找到该结点的直接前驱来替代(这里的直接前驱是指该结点的左子树中,值最大的那个结点);2)、或者找该结点的直接后继来替代(这里的直接后继指的是该结点的右子树中,值最小的那个结点)

对于3这种情况,为什么要这么删除,其实很好理解:左子树结点值<根结点值<右子树结点值,这是一个升序序列,待删除的结点就是根结点,要保持性质不变,得从前面左子树这块拿一个最大的,或者从右子树那块拿一个最小的,即与根结点关键字左右相邻的那个关键字的结点。

比如:删除关键字为32的结点

二叉查找树BST简单回顾_第4张图片

你可能感兴趣的:(数据结构与算法,数据结构,算法)