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树的验证 中序遍历 平衡判断 AVL树的性能 完整代码实现 AVL树 AVL树是最先发明 ...

  2. B树、B+树、AVL树、红黑树

    from: http://blog.csdn.net/chlele0105/article/details/8473846 binary search tree,中文翻译为二叉搜索树.二叉查找树或者二 ...

  3. AVL树(一)之 C语言的实现

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

  4. 平衡二叉树---AVL树的实现

    AVL树是最先发明的自平衡二叉查找算法,是平衡二叉树的一种.在AVL中任何节点的两个儿子子树的高度最大差别为1,所以它又被成为高度平衡树.查找.插入和删除在平均和最坏情况下都是O(log n).增加和 ...

  5. 【题集】AVL树、伸展树、红黑树、二叉查找树、替罪羊树的时间复杂度

    目录 1. AVL树 2.伸展树 3.红黑树 4.二叉查找树 5.替罪羊树 1. AVL树 AVL树是最先发明的自平衡二叉查找树.在AVL树中任何节点的两个子树的高度最大差别为一,所以它也被称为高度平 ...

  6. avl二叉树 java_平衡二叉树之AVL树(Adelson-Velsky and Landis Tree)简介及Java实现

    平衡二叉树之AVL树(Adelson-Velsky and Landis Tree)简介及Java实现 标签:#二叉树##数据结构##自平衡二叉树# 时间:2018/10/27 09:30:01 作者 ...

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

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

  8. 3. 数据结构--二叉树 BST AVL树 Huffman

    数据结构–二叉树 KEY:(不敢相信没有堆-) 二叉树的定义及其主要特征 ☑️ 二叉树的顺序存储结构和链式存储结构实现 二叉树的遍历及应用 二叉排序(查找.检索)树 (BST) 平衡的二叉检索树- A ...

  9. avl树左旋右旋的理解

    一直没搞懂非平衡二叉树变平衡二叉树时左旋右旋,今天下定决心搞懂,然后在众多博客中终于找到了这样一篇,非常形象,记录如下: AVL树是最先发明的自平衡二叉查找树.在AVL树中任何节点的两个子树的高度最大 ...

最新文章

  1. php python-浅谈php调用python文件
  2. 自动化监控--zabbix中的Macros(宏)详解
  3. Linux中su命令详解
  4. 小练习——过滤掉出现次数最多的数据
  5. python文件目录操作方法_Python常用的文件及文件路径、目录操作方法汇总介绍
  6. 【ArcGIS遇上Python】Python实现Modis NDVI批量化月最大合成
  7. [css] 你有用过animation-fill-mode属性吗?它有什么应用场景
  8. LeetCode 1234. 替换子串得到平衡字符串(滑动窗口)
  9. UDP之sendto错误解决
  10. 【Spring】Spring Bean 定义继承
  11. 基于JAVA+Servlet+JSP+MYSQL的人事管理系统
  12. 【备忘】二叉树遍历的迭代实现
  13. 电子技术基础(三)_第4章直流稳压电源__集成稳压器
  14. 终于交作业了,View Design 的设计资源上线啦,免费哦
  15. C/C++ DNS 查询IP地址
  16. c语言实现模糊分类矩阵,模糊聚类分析C程序实现
  17. gif图像分解、gif图像制作
  18. 《天道》解读三:什么是天道?
  19. 产品运营都必须知道的数据指标们
  20. 李彦宏:为理想找到归宿

热门文章

  1. Android常用ui,XUI: 一个简洁而优雅的Android原生UI框架,解放你的双手!
  2. axure文件如何加密_rp文件命名也可能导致文件无法打开
  3. linux 使用trick记录之20203010
  4. 转结构体_golang处理gb2312转utf8编码的问题
  5. python selenium 保存网页_python selenium+pywin32 实现网页另存为
  6. 电脑不能打字_宝妈、学生、上班族手机兼职——打字录入
  7. 微型计算机系统性能优化及测试,微型计算机系统测试、优化和升级基础知识习题...
  8. python控制鼠标点击标准模块_Python直接控制鼠标键盘模块 pyautogui
  9. js 数据类型_js中检测数据类型的方法汇总
  10. js排序的时间复杂度_JavaScript插入排序算法通俗说明