java生成avl文件_Java创建AVL树

AVL树是带有平衡条件的二叉查找树,其查找和删除的时间复杂度为logn,是对二叉查找树的改进,我们将节点的左子树和右子树深度之差称为平衡因子(BF),其中的每一个节点的平衡因子的绝对值不大于1。距离插入节点最近的,并且平衡因子绝对值大于1的节点为根的子树,称为最小不平衡子树。要实现AVL树,就必须保证在插入的时候消除不平衡的子树,即通过某种方式,使每次插入一个节点,都是平衡的BST树,下面我们讨论...
摘要由CSDN通过智能技术生成

AVL树是带有平衡条件的二叉查找树,其查找和删除的时间复杂度为logn,是对二叉查找树的改进,我们将节点的左子树和右子树深度之差称为平衡因子(BF),其中的每一个节点的平衡因子的绝对值不大于1。

距离插入节点最近的,并且平衡因子绝对值大于1的节点为根的子树,称为最小不平衡子树。

要实现AVL树,就必须保证在插入的时候消除不平衡的子树,即通过某种方式,使每次插入一个节点,都是平衡的BST树,下面我们讨论一下插入的时候四种情况:

1:对左孩子的左子树进行一次插入;

2:对左孩子的右子树进行一次插入;

3:对右孩子的左子树进行一次插入;

4:对右孩子的右子树进行一次插入;

其中情况1和情况4是关于镜像对称的,情况2和情况3是关于镜像对称的,

由于图片原因,我就上了几张不好看的图片,其中x,y,z和A,B,C,D为对应的节点的孩子,我直接对四种情况进行讲解:

情况1:假设节点k1,k1的左孩子k2,

单右旋转:对k1节点的左孩子k2的左子树进行插入,这样使得k1的BF为2,此时最小不平衡子树是以k1为根节点的子树,因此对其进行右旋转操作,使得新子树的根节点为原节点的左孩子即k2,k2的右孩子为k1,k1的左孩子为原子树中k2的右孩子;

6fab8ae032f841c44577f87cc69373ce.png

情况2:假设节点k1,k1的左孩子k3,k3的右孩子k2,

双左旋转:对以k2为根节点的子树进行插入操作,这时最小的不平衡子树是以k1为根节点的子树,但是单纯的左旋转不能解决问题,这和情况1有所区别,其原因在于K1的BF为2,而K3的BF为-1,两者的符号不一致,导致了不能只是进行一次旋转,所以分为两次旋转:

1:先对以K3为根节点的子树进行左旋转,

2:再对以K1为根节点的子树进行右旋转,

得到图中所示的结果,此时K2左子树B是K3右子树,K2右子树C是K1左子树,K2左孩子为K3,K

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值