AVL树

✍ dations ◷ 2025-08-02 16:43:03 #树结构

在计算机科学中,AVL树是最早被发明的自平衡二叉查找树。在AVL树中,任一节点对应的两棵子树的最大高度差为1,因此它也被称为高度平衡树。查找、插入和删除在平均和最坏情况下的时间复杂度都是 O ( log n ) {\displaystyle O(\log {n})} 个节点被旋转,而每次AVL旋转耗费固定的时间,所以删除处理在整体上耗费O(log ) 时间。

可以像普通二叉查找树一样的进行,所以耗费O(log )时间,因为AVL树总是保持平衡的。不需要特殊的准备,树的结构不会由于查找而改变。(这是与伸展树搜索相对立的,它会因为搜索而变更树结构。)

假设平衡因子是左子树的高度减去右子树的高度所得到的值,又假设由于在二叉排序树上插入节点而失去平衡的最小子树根节点的指针为a(即a是离插入点最近,且平衡因子绝对值超过1的祖先节点),则失去平衡后进行的规律可归纳为下列四种情况:

在平衡的二叉排序树BBST (Balancing Binary Search Tree)上插入一个新的数据元素e的递归算法可描述如下:

AVL树的调平(Erlang的实现)

 1 balance(null) -> null; 2 balance({null, _, null}=Tree) -> Tree; 3 balance({Left, Value, Right}=Tree) -> 4 	Diff = count(Left)-count(Right), 5 	if (Diff < 2) and (Diff > -2)	->	{balance(Left), Value, balance(Right)}; 6 	   (Diff > 1)				->	balance(rotate_right(Tree)); 7 	   (Diff< -1)				->	balance(rotate_left(Tree)); 8 	   true					->	exit('This is impossible!') 9 	end.10 11 rotate_right({Left, Value, Right}) ->12 	merge_max(Left, {null, Value, Right}).13 14 rotate_left({Left, Value, Right}) ->15 	merge_min(Right, {Left, Value, null}).16 17 merge_min({null, Value, Right}, Tree2) ->18 	{Tree2, Value, Right};19 merge_min({Left, _, _}, Tree2) ->20 	merge_min(Left, Tree2).21 22 merge_max({Left , Value, null}, Tree2) ->23 	{Left, Value, Tree2};24 merge_max({_, _, Right}, Tree2) ->25 	merge_max(Right, Tree2).

AVL节点数计算

高度为h的AVL树,总节点数N最多 2 h 1 {\displaystyle 2^{h}-1} ; 最少节点数 N h {\displaystyle N_{h}} 如以斐波那契数列可以用数学归纳法证明:
N h {\displaystyle N_{h}} = F h + 2 {\displaystyle F_{h+2}} - 1 ( F h + 2 {\displaystyle F_{h+2}} 是斐波那契数列的第h+2项,根据斐波那契多项式得来)。
即:
N 0 {\displaystyle N_{0}} = 0 (表示AVL Tree高度为0的节点总数)
N 1 {\displaystyle N_{1}} = 1 (表示AVL Tree高度为1的节点总数)
N 2 {\displaystyle N_{2}} = 2 (表示AVL Tree高度为2的节点总数)
N h {\displaystyle N_{h}} = N h 1 {\displaystyle N_{h-1}} + N h 2 {\displaystyle N_{h-2}} + 1 (表示AVL Tree高度为h的节点总数)
换句话说,当节点数为N时,高度h最多为 l o g Φ ( 5 ( N + 1 ) ) 2 {\displaystyle log_{\Phi }({\sqrt {5}}*(N+1))-2}

相关

  • ACys1G96, 1R4C, 1TIJ, 3GAX, 3NX0, 3PS8, 3QRD, 3S67, 3SVA· protease binding · endopeptidase inhibitor activity · cysteine-type endopeptidase inhibitor activity
  • 超星系团超星系团是在宇宙的大尺度结构中,比星系团和星系群更大的结构。可观测宇宙中的超星系团约有1,000万个。现存的超星系团显示宇宙内的星系分布是不均匀的;多数的都聚集在一起成
  • 齐格勒卡尔·齐格勒(Karl Waldemar Ziegler,1898年11月26日-1973年8月11日),德国化学家。在聚合反应催化剂研究方面有很大贡献,并因此与意大利化学家居里奥·纳塔共同获得1963年诺贝尔化
  • 日震学日震学(英语:Helioseismology)是研究波振荡,特别是声波压力,在太阳上的传播。不同于地球的地震波,太阳的波几乎没有剪力的成分 (S波)。太阳压力波被认为是接近太阳表面的对流层中
  • 经济战经济战是指利用经济封锁敌方补给资源,以达到使敌人军队士气低迷厌战而主动投降的作战方针之一,此战略曾用于斯大林格勒保卫战(苏联对德军第6军团的口袋包围)。
  • 弱核力弱相互作用(又称弱力或弱核力)是自然的四种基本力中的一种,其余三种为强核力、电磁力及万有引力。亚原子粒子的放射性衰变就是由它引起的,恒星中一种叫氢聚变的过程也是由它启动
  • 冲浪冲浪是一种冲浪者利用冲浪板越过涌起浪头激烈水上运动。主要的配备是冲浪板和系在脚上的安全绳。冲浪是波里尼西亚人的一项古老文化。他们的酋长是部落中技术最好的驾浪者、
  • 南西方面舰队南西方面舰队是大日本帝国海军于1942年(昭和17年)4月10日编制的舰队。南方作战完成后、菲律宾・中南半岛・印度尼西亚・马来方面的哨戒・输送・警备原来各由个别舰队执行,为了
  • 朗代尔朗代尔(Lawndale)是美国加利福尼亚州洛杉矶县下属的一座城市,位于大洛杉矶地区的南湾地区。在2010年的人口普查中,人口为32,769,而2000年人口普查的人口为31,711。
  • 永兴县永兴县位于中国湖南省东南部,为郴州市下辖县。全境处南岭山脉北麓;面积1,979.4平平方公里,位居全省县市的第50位;常住人口572,960人(2010年),居全省第45位;年末户籍人口66.42万人(201