Loading AI tools
来自维基百科,自由的百科全书
AVL树(英语:AVL tree)是计算机科学中最早被发明的自平衡二叉查找树。在AVL树中,任一节点对应的两棵子树的最大高度差为1,因此它也被称为高度平衡树。查找、插入和删除在平均和最坏情况下的时间复杂度都是 。增加和删除元素的操作则可能需要借由一次或多次树旋转,以实现树的重新平衡。AVL树得名于它的发明者格奥尔吉·阿杰尔松-韦利斯基和叶夫根尼·兰迪斯,他们在1962年的论文《An algorithm for the organization of information》中公开了这一数据结构。
节点的平衡因子是它的左子树的高度减去它的右子树的高度(有时相反)。带有平衡因子1、0或 -1的节点被认为是平衡的。带有平衡因子 -2或2的节点被认为是不平衡的,并需要重新平衡这个树。平衡因子可以直接存储在每个节点中,或从可能存储在节点中的子树高度计算出来。
AVL树的基本操作一般涉及运作同在不平衡的二叉查找树所运作的同样的算法。但是要进行预先或随后做一次或多次所谓的"AVL旋转"。
以下图表以四列表示四种情况,每行表示在该种情况下要进行的操作。在左左和右右的情况下,只需要进行一次旋转操作;在左右和右左的情况下,需要进行两次旋转操作。
从AVL树中删除,可以通过把要删除的节点向下旋转成一个叶子节点,接着直接移除这个叶子节点来完成。因为在旋转成叶子节点期间最多有log n个节点被旋转,而每次AVL旋转耗费固定的时间,所以删除处理在整体上耗费O(log n) 时间。
可以像普通二叉查找树一样的进行,所以耗费O(log n)时间,因为AVL树总是保持平衡的。不需要特殊的准备,树的结构不会由于查找而改变。(这是与伸展树搜寻相对立的,它会因为搜寻而变更树结构。)
假设平衡因子是左子树的高度减去右子树的高度所得到的值,又假设由于在二叉排序树上插入节点而失去平衡的最小子树根节点的指针为a(即a是离插入点最近,且平衡因子绝对值超过1的祖先节点),则失去平衡后进行的规律可归纳为下列四种情况:
在平衡的二叉排序树BBST (Balancing Binary Search Tree)上插入一个新的数据元素e的递归算法可描述如下:
AVL树的调平(Erlang的实现)
balance(null) -> null;
balance({null, _, null}=Tree) -> Tree;
balance({Left, Value, Right}=Tree) ->
Diff = count(Left)-count(Right),
if (Diff < 2) and (Diff > -2) -> {balance(Left), Value, balance(Right)};
(Diff > 1) -> balance(rotate_right(Tree));
(Diff< -1) -> balance(rotate_left(Tree));
true -> exit('This is impossible!')
end.
rotate_right({Left, Value, Right}) ->
merge_max(Left, {null, Value, Right}).
rotate_left({Left, Value, Right}) ->
merge_min(Right, {Left, Value, null}).
merge_min({null, Value, Right}, Tree2) ->
{Tree2, Value, Right};
merge_min({Left, _, _}, Tree2) ->
merge_min(Left, Tree2).
merge_max({Left , Value, null}, Tree2) ->
{Left, Value, Tree2};
merge_max({_, _, Right}, Tree2) ->
merge_max(Right, Tree2).
高度为h的AVL树,总节点数N最多;
最少节点数如以斐波那契数列可以用数学归纳法证明:
= - 1 (是斐波那契数列的第h+2项,根据斐波那契多项式得来)。
即:
= 0 (表示AVL Tree高度为0的节点总数)
= 1 (表示AVL Tree高度为1的节点总数)
= 2 (表示AVL Tree高度为2的节点总数)
= + + 1 (表示AVL Tree高度为h的节点总数)
换句话说,当节点数为N时,高度h最多为。
Seamless Wikipedia browsing. On steroids.
Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.
Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.