AVL树——树的学习(4)

AVL树的相关概念

  • AVL树是带有平衡条件的二叉查找树,这个平衡条件必须容易保持,而且它必须保证树的深度是O(logN)
  • 一棵AVL树是其每个节点的左子树和右子树的高度最多差1的二叉查找树。空树的高度定义为-1,再AVL树的定义中,每一个节点(在其节点结构中)保留高度信息。
  • 大致上讲,一个AVL树的高度最多为1.44log(N+2)-1.328,但是实际上的高度只比longN稍微多一点
  • 除去可能的插入外,所有的操作都可以以时间O(logN)执行。当进入插入操作时,我们需要更新通向根节点路径上那些节点的所有平衡信息,这个可以通过旋转来完成
  • AVL树的节点声明为:
struct AvlTree{
	ElementType Element;//关键值
	AvlTree* Left;//左子树
	AvlTree* Right;//右子树
	int Height;//节点的高度
}

旋转操作

  • 在插入操作之后,只有那些从插入点到根节点的路径上的节点的平衡可能被改变,当我们沿着这条路径上行到根并更新平衡信息时,我们可以找到一个节点,它的新平衡破坏了AVL树的条件,我们可以通过在第一个这样的节点(即最深不平衡节点)重新调整为AVL树
  • 我们把必须重新平衡的点叫做节点a,当高度不平衡时,a的两颗子树的高度差为2,这种平衡有可能出现在下面的四种情况:
    • 对a的左儿子的左子树进行一次插入(左-左)
    • 对a的左儿子的右子树进行一次插入(左-右)
    • 对a的右儿子的左子树进行一次插入(右-左)
    • 对a的右儿子的右子树进行一次插入(右-右)
单旋转

单旋转是针对(左-左)和(右-右)情况的,旋转方法是:找离新插入的节点最近的不平衡的树进行调整,以该不平衡的AVL树的根节点和插入点所在的根节点的儿子为对象进行旋转操作

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值