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树的根节点和插入点所在的根节点的儿子为对象进行旋转操作

发布了37 篇原创文章 · 获赞 0 · 访问量 554

猜你喜欢

转载自blog.csdn.net/clearLB/article/details/104225227
今日推荐