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. 注册表数据提取工具RegRipper

    注册表数据提取工具RegRipper   注册表是Windows操作系统一个数据库,用来存储系统和应用程序设置信息.注册表信息分别保存在操作系统中的6个Hive文件中.获取这几个文件,就可以从中提取注 ...

  2. [BZOJ 1412] 狼与羊的故事

    Link: BZOJ 1412 传送门 Solution: 非常明显的最小割模型: 将所有点分成两个互不相邻的点集,且要求代价最小 建图: $<S,sheep,INF>$ $<wol ...

  3. POJ 2836 Rectangular Covering(状压DP)

    [题目链接] http://poj.org/problem?id=2836 [题目大意] 给出二维平面的一些点,现在用一些非零矩阵把它们都包起来, 要求这些矩阵的面积和最小,求这个面积和 [题解] 我 ...

  4. 程设刷题 | 程序设计实践II-2017(部分)

    目录 1165-算术题 题目描述 代码实现 1184-Tourist 1 题目描述 代码实现 1186-Tourist 2 题目描述 代码实现 1224-LOVE 题目描述 代码实现 1256-湘潭大 ...

  5. Visual Studio Package扩展——vsct文件简介

    首先我们使用向导生成一个package的扩展,里面就会发现一个vsct文件.vsct文件的全称是Visual Studio Command Table,它其实就是一个xml文件,通过一定的规则来描述v ...

  6. c++中resize这个函数怎么用

    c++中序列式容器的一个共性函数, vv.resize(int n,element)表示调整容器vv的大小为n,扩容后的每个元素的值为element,默认为0 resize()会改变容器的容量和当前元 ...

  7. What is the purpose of mock objects?

    Since you say you are new to unit testing and asked for mock objects in "layman's terms", ...

  8. selenium 调用方法

    #coding:utf-8 from selenium import webdriver url = "http://demo.testfire.net" chrome_optio ...

  9. django自定义过滤器及模板标签

    创建一个模板库 不管是写自定义标签还是过滤器,第一件要做的事是创建模板库(Django能够导入的基本结构). 创建一个模板库分两步走: 第一,决定模板库应该放在哪个Django应用下. 如果你通过 m ...

  10. JS-只能输入中文和英文

    <span style="font-family:KaiTi_GB2312;">转自:<a target=_blank href="http://www ...