java-数据结构-二分搜索树和avl平衡树

1.二分搜索树

本身是一个二叉树,但对于每个结点而言,左子树比根节点小,右子树比根节点大,且不包含重复元素。

1-1添加元素

用下图元素举例

定义一个cur游标,先判断树是否为空,若为空则直接进入,如图1,然后3进入,比较3和4的大小,4比3大且4的左孩子为空则,3为4的左孩子。5和4比较,5比4大且4的右孩子为空,则5为4的右孩子。

                       

 然后1与4比较,1小于4,则应该在左孩子上,但因为左孩子不为空(当前左孩子为3),则1与3再次比较,1小于3,且3的左孩子为空,1就为3的左孩子。2与4比较,2小于4,应为4的左孩子,因为,4左孩子不为空,则2与3再比较,2比3小,则应为3的左孩子,又因为3的左孩子不为空(此时3的左孩子为1),则2和1再比较,2比1大,且1的右孩子为空,即2为1的右孩子。同理,6比4大,且比5大,且5右孩子为空,即6为5的右孩子。

                 

1-4删除最小值

先找到最小值,然后进行如图操作,让2取代1,作为3的左孩子。

    

1-5删除最大值

先找到最大值,操作如图。

         

 若最大值还有左孩子的话则如图

        

 将6的左孩子成为5的右孩子,也就是最大值的左孩子替换最大值位置。

1-6删除任意值

例图,我们假设想删除结点3,那么进行图1操作,结果如图2

   

 再举例如图

对28进行删除,那么进行操作如图1 ,删除后如图2所示(这里是用26作为28的替换)

     

2.avl平衡树

对于任意一个节点,左子树和右子树的高度差不能超过1。满二叉树一定是平衡树且高度最低,完全二叉树也是平衡树。

avl平衡树是什么样子?

就拿上述的图来看

 根节点20,它的左子树的深度为4,而右子树的深度为3,俩个高度差为1,符合条件。在以16结点为例,左子树深度为3,右子树为空(即深度为0),那么这个树就不是avl平衡树。

 而这个树,每个结点的左右子树的高度差不会超过1,则上图这个数为avl平衡树。

平衡树的调整

 我们看图,就是断开x与y和t3,将t3与y连接然后将以y为根节点的树为x的右子树。

 rr旋转和ll旋转刚好相反。断开x与y和t3,t3成为y的右子树。然后以y为结点的树作为x的左子树。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值