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 [ ( 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 树的更多相关文章

  1. 【数据结构】平衡二叉树—AVL树

    (百度百科)在计算机科学中,AVL树是最先发明的自平衡二叉查找树.在AVL树中任何节点的两个子树的高度最大差别为一,所以它也被称为高度平衡树.查找.插入和删除在平均和最坏情况下都是O(log n).增 ...

  2. AVL树(一)之 图文解析 和 C语言的实现

    概要 本章介绍AVL树.和前面介绍"二叉查找树"的流程一样,本章先对AVL树的理论知识进行简单介绍,然后给出C语言的实现.本篇实现的二叉查找树是C语言版的,后面章节再分别给出C++ ...

  3. AVL树的左旋右旋理解 (转)

    AVL树是最先发明的自平衡二叉查找树.在AVL树中任何节点的两个子树的高度最大差别为一,所以它也被称为高度平衡树.查找.插入和删除在平均和最坏情况下都是O(log n).增加和删除可能需要通过一次或多 ...

  4. 简单数据结构———AVL树

    C - 万恶的二叉树 Crawling in process... Crawling failed Time Limit:1000MS     Memory Limit:32768KB     64b ...

  5. 算法二叉搜索树之AVL树

    最近学习了二叉搜索树中的AVL树,特在此写一篇博客小结. 1.引言 对于二叉搜索树而言,其插入查找删除等性能直接和树的高度有关,因此我们发明了平衡二叉搜索树.在计算机科学中,AVL树是最先发明的自平衡 ...

  6. AVL树,红黑树

    AVL树 https://baike.baidu.com/item/AVL%E6%A0%91/10986648 在计算机科学中,AVL树是最先发明的自平衡二叉查找树.在AVL树中任何节点的两个子树的高 ...

  7. AVL树的理解及自写AVL树

    AVL树是最先发明的自平衡二叉查找树.在AVL树中任何节点的两个子树的高度最大差别为一,所以它也被称为高度平衡树.查找.插入和删除在平均和最坏情况下都是O(log n).增加和删除可能需要通过一次或多 ...

  8. 红黑树与AVL树

    概述:本文从排序二叉树作为引子,讲解了红黑树,最后把红黑树和AVL树做了一个比较全面的对比. 1 排序二叉树 排序二叉树是一种特殊结构的二叉树,可以非常方便地对树中所有节点进行排序和检索. 排序二叉树 ...

  9. AVL树的实现——c++

    一.概念 AVL树是根据它的发明者G.M. Adelson-Velsky和E.M. Landis命名的.它是最先发明的自平衡二叉查找树,也被称为高度平衡树.相比于"二叉查找树",它 ...

随机推荐

  1. Tomcat配置和Spring MVC配置

    Tomcat启动时,先找系统变量CATALINA_BASE,如果没有,则找CATALINA_HOME.然后找这个变量所指的目录下的conf文件夹,从中读取配置文件.最重要的配置文件:server.xm ...

  2. [BZOJ 1509] 逃学的小孩

    Link: BZOJ 1509 传送门 Solution: 一开始受样例影响又犯了想当然的毛病……图中的C点不一定在直径上! 3次$dfs$求出树的直径及直径的两个端点$rt1,rt2$到每个点的距离 ...

  3. [xsy2579]counting

    $\newcommand{\align}[1]{\begin{align*}#1\end{align*}}$题意:对于一个字符串$s$,定义$C(s)$为$s$中(出现次数最多的字母)出现的次数,问长 ...

  4. bean装配--注解

    1,Dao层 package com.songyan.zhujie; public interface UserDao { public void say(); } package com.songy ...

  5. C# html的Table导出到Excel中

    C#中导出Excel分为两大类.一类是Winform的,一类是Web.今天说的这一种是Web中的一种,把页面上的Table部分导出到Excel中. Table导出Excel,简单点说,分为以下几步: ...

  6. 查看HttpSession中存放了哪些值

    今天遇到了一个小问题,就是查看HttpSession中都存放了哪些值.解决办法如下: HttpSession session = request.getSession(); for ( Enumera ...

  7. 几个有关Hadoop自带的性能测试工具的应用

    http://www.talkwithtrend.com/Question/177983-1247453 一些测试的描述如下内容最为详细,供你参考: 测试对于验证系统的正确性.分析系统的性能来说非常重 ...

  8. 2017.7.10 (windows)redis的安装

    参考来自:http://www.runoob.com/redis/redis-install.html 1.下载地址 https://github.com/MSOpenTech/redis/relea ...

  9. D3学习之:D3.js中的12中地图投影方式

    特别感谢:1.[张天旭]的D3API汉化说明.已被引用到官方站点: 2.[馒头华华]提供的ourd3js.com上提供的学习系列教程,让我们这些新人起码有了一个方向. 不得不说,学习国外的新技术真的是 ...

  10. 2.oracle分页,找到员工表中薪水大于本部门平均薪水的员工

     ROWNUM的知识点 A ROWNUM依照oracle的默认机制生成. B rownum仅仅能使用<=  <号,不能使用>  >= rownum的实现机制 rownum表 ...