高度平衡树 -- 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 ) ) ] ) )





  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值