高度平衡树 -- AVL 树
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 树的更多相关文章
- 【数据结构】平衡二叉树—AVL树
(百度百科)在计算机科学中,AVL树是最先发明的自平衡二叉查找树.在AVL树中任何节点的两个子树的高度最大差别为一,所以它也被称为高度平衡树.查找.插入和删除在平均和最坏情况下都是O(log n).增 ...
- AVL树(一)之 图文解析 和 C语言的实现
概要 本章介绍AVL树.和前面介绍"二叉查找树"的流程一样,本章先对AVL树的理论知识进行简单介绍,然后给出C语言的实现.本篇实现的二叉查找树是C语言版的,后面章节再分别给出C++ ...
- AVL树的左旋右旋理解 (转)
AVL树是最先发明的自平衡二叉查找树.在AVL树中任何节点的两个子树的高度最大差别为一,所以它也被称为高度平衡树.查找.插入和删除在平均和最坏情况下都是O(log n).增加和删除可能需要通过一次或多 ...
- 简单数据结构———AVL树
C - 万恶的二叉树 Crawling in process... Crawling failed Time Limit:1000MS Memory Limit:32768KB 64b ...
- 算法二叉搜索树之AVL树
最近学习了二叉搜索树中的AVL树,特在此写一篇博客小结. 1.引言 对于二叉搜索树而言,其插入查找删除等性能直接和树的高度有关,因此我们发明了平衡二叉搜索树.在计算机科学中,AVL树是最先发明的自平衡 ...
- AVL树,红黑树
AVL树 https://baike.baidu.com/item/AVL%E6%A0%91/10986648 在计算机科学中,AVL树是最先发明的自平衡二叉查找树.在AVL树中任何节点的两个子树的高 ...
- AVL树的理解及自写AVL树
AVL树是最先发明的自平衡二叉查找树.在AVL树中任何节点的两个子树的高度最大差别为一,所以它也被称为高度平衡树.查找.插入和删除在平均和最坏情况下都是O(log n).增加和删除可能需要通过一次或多 ...
- 红黑树与AVL树
概述:本文从排序二叉树作为引子,讲解了红黑树,最后把红黑树和AVL树做了一个比较全面的对比. 1 排序二叉树 排序二叉树是一种特殊结构的二叉树,可以非常方便地对树中所有节点进行排序和检索. 排序二叉树 ...
- AVL树的实现——c++
一.概念 AVL树是根据它的发明者G.M. Adelson-Velsky和E.M. Landis命名的.它是最先发明的自平衡二叉查找树,也被称为高度平衡树.相比于"二叉查找树",它 ...
随机推荐
- luogu P1195 口袋的天空
题目背景 小杉坐在教室里,透过口袋一样的窗户看口袋一样的天空. 有很多云飘在那里,看起来很漂亮,小杉想摘下那样美的几朵云,做成棉花糖. 题目描述 给你云朵的个数N,再给你M个关系,表示哪些云朵可以连在 ...
- 【hdu1150】【Machine Schedule】二分图最小点覆盖+简单感性证明
(上不了p站我要死了,侵权度娘背锅) 题目大意 有两台机器A和B以及N个需要运行的任务.每台机器有M种不同的模式,而每个任务都恰好在一台机器上运行.如果它在机器A上运行,则机器A需要设置为模式ai,如 ...
- [JSOI2017]原力
题目大意: 一个$n(n\le5\times10^4)$个点,$m(m\le10^5)$条边的无向图.每条边有一个边权$w_i(w_i\le10^6)$和一个附加属性$t_i(t_i\in\{R,G, ...
- hdu 1500 Chopsticks DP
题目链接:HDU - 1500 In China, people use a pair of chopsticks to get food on the table, but Mr. L is a b ...
- c# 中文字符(全角、半角)通用处理
声明:本文仅提供一种编程思路,所提供代码仅供参考,如需使用,请自行完善. 我们在做程序的的时候经常要处理用户输入,作为我们的主要语言中文,经常会出现全角.半角的问题,这会在查询时给我们带来很多麻烦.本 ...
- cocurrent包ExecutorService线程池
16. 执行器服务 ExecutorService java.util.concurrent.ExecutorService 接口表示一个异步执行机制,使我们能够在后台执行任务.因此一个 Execut ...
- 【spring boot】集成了druid后,同样的mybatis模糊查询语句出错Caused by: com.alibaba.druid.sql.parser.ParserException: syntax error, error in :'name LIKE '%' ? '%'
druid版本是 <!-- https://mvnrepository.com/artifact/com.alibaba/druid 数据库连接池--> <dependency> ...
- Quartz配置CronTrigger
CronTrigger 构造器 String name, //触发器名称 String group, //触发器的组名 String jobName, //job名称 String jobGroup, ...
- 深入理解brew link命令
来源:https://newsn.net/say/brew-link-php71.html brew是mac机上面程序猿非常常用的软件包安装方式,其中有两组命令是需要大家知晓的.分别是: 第一组:br ...
- Nginx 服务并发过10万的Linux内核优化配置
以下Linux 系统内核优化配置均经在线业务系统测试,服务器运行状态良好,用了一些时间整理,现和大家分享一下,如有那位高人看到配置上有问题,请给与指出! # Controls the use of T ...