高度平衡树 -- AVL树

#lang scheme

( define nil ‘() )

( define ( root tree )( car tree ) )

( define ( left-tree tree )( cadr tree ) )

( define ( right-tree tree )( caddr tree ) )

( define ( height tree )

( cond [ ( null? tree ) 0 ]

[ else ( cadddr tree ) ] ) )

( define ( make-leaf elem )( list elem nil nil 1 ) )

( define ( make-avl-tree root left right )

( list root left right ( + 1 ( max ( height left )

( height right ) ) ) ) )

( define ( contains-elem? elem tree )

( cond [ ( null? tree ) false ]

[ ( = elem ( root tree ) ) true ]

[ ( < elem ( root tree ) )

( contains-elem? elem ( left-tree tree ) ) ]

[ ( > elem ( root tree ) )

( contains-elem? elem ( right-tree tree ) ) ] ) )

( define ( rotate-left-left tree )

( cond [ ( null? tree ) tree ]

[ else ( make-avl-tree ( root ( left-tree tree ) )

( left-tree ( left-tree tree ) )

( make-avl-tree ( root tree )

( right-tree ( left-tree tree ) )

( right-tree tree ) )  ) ] ) )

( define ( rotate-right-right tree )

( cond [ ( null? tree ) tree ]

[ else ( make-avl-tree ( root ( right-tree tree ) )

( make-avl-tree ( root tree )

( left-tree tree )

( left-tree ( right-tree tree ) ) )

( right-tree ( right-tree tree ) ) ) ] ) )

( define ( rotate-right-left tree )

( cond [ ( null? tree ) tree ]

[ else ( make-avl-tree ( left-tree ( right-tree tree ) )

( make-avl-tree ( root tree )

( left-tree tree )

( left-tree ( left-tree ( right-tree tree ) ) ) )

( make-avl-tree ( root ( right-tree tree ) )

( right-tree ( left-tree ( right-tree tree ) ) )

( right-tree ( right-tree tree ) ) ) ) ] ) )

( define ( rotate-left-right tree )

( cond [ ( null? tree ) tree ]

[ else ( make-avl-tree ( root ( right-tree ( left-tree tree ) ) )

( make-avl-tree ( root ( left-tree tree ) )

( left-tree ( left-tree tree ) )

( left-tree ( right-tree ( left-tree tree ) ) ) )

( make-avl-tree ( root tree )

( right-tree ( right-tree ( left-tree tree ) ) )

( right-tree tree ) ) ) ] ) )

( define ( balance-avl-tree tree )

( define ( factor tree )

( - ( height ( right-tree tree ) )

( height ( left-tree tree ) ) ) )

( let ( [ f ( factor tree ) ] )

( cond [ ( = f 2 )

( cond [ ( < ( factor ( right-tree tree ) ) 0 )

( rotate-right-left tree ) ]

[ else ( rotate-right-right tree ) ] ) ]

[ ( = f -2 )

( cond [ ( > ( factor ( left-tree tree ) ) 0 )

( rotate-left-right tree ) ]

[ else ( rotate-left-left tree ) ] ) ]

[ else tree ] ) ) )

( define ( insert-elem elem tree )

( define ( insert-in-son elem tree )

( cond [ ( null? tree )

( make-leaf elem ) ]

[ ( < elem ( root tree ) )

( let* ( [ newLeftTree ( insert-in-son elem ( left-tree tree ) ) ]

[ newAVLTree ( make-avl-tree ( root tree )

newLeftTree

( right-tree tree ) ) ] )

( balance-avl-tree newAVLTree ) ) ]

[ ( > elem ( root tree ) )

( let* ( [ newRightTree ( insert-in-son elem ( right-tree tree ) ) ]

[ newAVLTree ( make-avl-tree ( root tree )

( left-tree tree )

newRightTree ) ] )

( balance-avl-tree newAVLTree ) ) ]

[ else tree ] ) )

( cond [ ( contains-elem? elem tree ) tree ]

[ else ( insert-in-son elem tree ) ] ) )

( define ( delete-elem elem tree )

( define ( delete-left-most tree )

( cond [ ( left-empty? tree ) tree ]

[ else ( let* ( [ leftMost ( delete-left-most ( left-tree tree ) ) ]

[ newRightTree ( make-avl-tree ( root tree )

( right-tree leftMost )

( right-tree tree ) ) ] )

( make-avl-tree ( root leftMost )

nil

( balance-avl-tree newRightTree ) ) ) ] ) )

( define ( delete-in-son elem tree )

( cond [ ( < elem ( root tree ) )

( let* ( [ newLeftTree ( delete-in-son elem ( left-tree tree ) ) ]

[ newAVLTree ( make-avl-tree ( root tree )

newLeftTree

( right-tree tree ) ) ] )

( balance-avl-tree newAVLTree ) ) ]

[ ( > elem ( root tree ) )

( let* ( [ newRightTree ( delete-in-son elem ( right-tree tree ) ) ]

[ newAVLTree ( make-avl-tree ( root tree )

( left-tree tree )

newRightTree ) ] )

( balance-avl-tree newAVLTree ) ) ]

[ ( = elem ( root tree ) )

( cond [ ( and ( right-empty? tree )

( left-empty? tree ) )

nil ]

[ ( right-empty? tree )

( left-tree tree ) ]

[ ( left-empty? tree )

( right-tree tree ) ]

[ else ( let ( [ leftMost ( delete-left-most ( right-tree tree ) ) ] )

( make-avl-tree ( root leftMost )

( left-tree tree )

( right-tree leftMost ) ) ) ] ) ] ) )

( define ( left-empty? tree )( null? ( left-tree tree ) ) )

( define ( right-empty? tree )( null? ( right-tree tree ) ) )

( cond [ ( contains-elem? elem tree )

( delete-in-son elem tree ) ]

[ else tree ] ) )

( define ( list->avl elems )

( define ( iter elems tree )

( cond [ ( null? elems ) tree ]

[ else ( iter ( cdr elems )

( insert-elem ( car elems ) tree ) ) ] ) )

( cond [ ( null? elems ) ‘() ]

[ else ( let( [ avl ( make-leaf ( car elems ) ) ] )

( iter ( cdr elems ) avl ) ) ] ) )


高度平衡树 -- AVL树,布布扣,bubuko.com

时间: 2024-08-04 22:30:07

高度平衡树 -- AVL树的相关文章

高度平衡树 -- AVL 树

原本打算用 Cpp,Ada,Python 各重写一份,觉得这种行为比较2. 因为还是 Scheme 的表达最优雅. #lang scheme ( define nil '() ) ( define ( root tree )( car tree ) ) ( define ( left-tree tree )( cadr tree ) ) ( define ( right-tree tree )( caddr tree ) ) ( define ( height tree ) ( cond [ (

AVL树的初步生成与插入操作

平衡二叉树(Balanced Binary Tree)又被称为AVL树(有别于AVL算法),且具有以下性质:它是一 棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树.构造与调整方法 平衡二叉树的常用算法有红黑树.AVL.Treap等. 最小二叉平衡树的节点的公式如下 F(n)=F(n-1)+F(n-2)+1 这个类似于一个递归的数列,可以参考Fibonacci数列,1是根节点,F(n-1)是左子树的节点数量,F(n-2)是右子树的节点数量. AVL是最先发明的

[转载]AVL树(一)之 图文解析 和 C语言的实现

概要 本章介绍AVL树.和前面介绍"二叉查找树"的流程一样,本章先对AVL树的理论知识进行简单介绍,然后给出C语言的实现.本篇实现的二叉查找树是C语言版的,后面章节再分别给出C++和Java版本的实现. 建议:若您对"二叉查找树"不熟悉,建议先学完"二叉查找树"再来学习AVL树. 目录 1. AVL树的介绍 2. AVL树的C实现3. AVL树的C实现(完整源码) 4. AVL树的C测试程序 转载请注明出处:http://www.cnblogs.

AVL树非递归插入删除思路

AVL树是最先发明的自平衡二叉查找树.在AVL树中任何节点的两个子树的高度最大差别为一,所以它也被称为高度平衡树.查找.插入和删除在平均和最坏情况下都是O(log n).增加和删除可能需要通过一次或多次树旋转来重新平衡这个树.AVL树得名于它的发明者G.M. Adelson-Velsky和E.M. Landis,他们在1962年的论文<An algorithm for the organization of information>中发表了它. 节点的平衡因子是它的左子树的高度减去它的右子树的

算法二叉搜索树之AVL树

最近学习了二叉搜索树中的AVL树,特在此写一篇博客小结. 1.引言 对于二叉搜索树而言,其插入查找删除等性能直接和树的高度有关,因此我们发明了平衡二叉搜索树.在计算机科学中,AVL树是最先发明的自平衡二叉搜索树.在AVL树中任何节点的两个子树的高度最大差别为一,所以它也被称为高度平衡树.对于N个节点的AVL树,由于树高被限制为lgN,因此其插入查找删除操作耗时为O(lgN). 2.旋转 在讲解关键步骤插入与删除以前,首先我们先定义一些辅助用的操作:旋转.旋转分为左旋和右旋,其示意图如下: 相信上

简单数据结构———AVL树

C - 万恶的二叉树 Crawling in process... Crawling failed Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Practice HDU 2193 Description An AVL tree is a kind of balanced binary search tree. Named after their invento

平衡二叉树之AVL树

AVL树(命名来源于作者姓名,Adelson-Velskii和Landis),即平衡二叉树,满足以下的条件: 1)它的左子树和右子树都是AVL树 2)左子树和右子树的高度差不能超过1 从条件1可能看出是个递归定义. AVL树中任何节点的两个儿子子树的高度最大差别为一,所以它也被称为高度平衡树. AVL树插入节点的步骤,分为2类: 第1类:外侧插入,单旋转 第2类:内侧插入,双旋转(先旋转成外侧插入的情况,再单旋转) 由于调整以后,树高与插入前是相同的,所以无需再向上查看balance情况 代码实

【算法导论学习-26】 二叉树专题4:红黑树、AVL树、B-Tree

1.   红黑树(Red-Black Trees) 参考<算法导论>P308页,红黑树是一种对树的高度要求最灵活的准平衡二叉搜索树.五大属性: 1: Every node is either RED or BLACK. 2: The root is black. 3: Every leaf(NIL) is black.  (The NIL is the sentinel.) 4: If a node is RED, then both its children areblack. 5: For

红黑树和AVL树的比较

1. 红黑树并不追求"完全平衡"--它只要求部分地达到平衡要求,降低了对旋转的要求,从而提高了性能. 红黑树能够以O(log2 n) 的时间复杂度进行搜索.插入.删除操作.此外,由于它的设计,任何不平衡都会在三次旋转之内解决.当然,还有一些更好的,但实现起来更复杂的数据结构,能够做到一步旋转之内达到平衡,但红黑树能够给我们一个比较"便宜"的解决方案.红黑树的算法时间复杂度和AVL相同,但统计性能比AVL树更高. 当然,红黑树并不适应所有应用树的领域.如果数据基本上是