AVLTree.st
author Claus Gittinger <cg@exept.de>
Sun, 05 Aug 2012 11:30:47 +0200
changeset 2765 4d2b566e062f
parent 1931 00a0d32ed23b
child 4115 2fc42df540e6
permissions -rw-r--r--
category changes
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1931
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     1
"
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     2
  Copyright (c) 2005 Ian Piumarta
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     3
  All rights reserved.
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     4
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     5
  Permission is hereby granted, free of charge, to any person obtaining a
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     6
  copy of this software and associated documentation files (the 'Software'),
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     7
  to deal in the Software without restriction, including without limitation
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     8
  the rights to use, copy, modify, merge, publish, distribute, and/or sell
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     9
  copies of the Software, and to permit persons to whom the Software is
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    10
  furnished to do so, provided that the above copyright notice(s) and this
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    11
  permission notice appear in all copies of the Software and that both the
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    12
  above copyright notice(s) and this permission notice appear in supporting
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    13
  documentation.
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    14
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    15
  THE SOFTWARE IS PROVIDED 'AS IS'.  USE ENTIRELY AT YOUR OWN RISK.
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    16
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    17
  Last edited: 2007-01-25 03:17:27 by piumarta on emilia.local
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    18
"
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    19
"{ Package: 'stx:libbasic2' }"
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    20
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    21
SequenceableCollection subclass:#AVLTree
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    22
	instanceVariableNames:'rootNode orderBlock'
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    23
	classVariableNames:''
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    24
	poolDictionaries:''
2765
4d2b566e062f category changes
Claus Gittinger <cg@exept.de>
parents: 1931
diff changeset
    25
	category:'Collections-Ordered-Trees'
1931
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    26
!
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    27
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    28
Object subclass:#AVLNil
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    29
	instanceVariableNames:''
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    30
	classVariableNames:''
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    31
	poolDictionaries:''
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    32
	privateIn:AVLTree
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    33
!
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    34
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    35
Object subclass:#AVLTreeNode
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    36
	instanceVariableNames:'left right height value'
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    37
	classVariableNames:''
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    38
	poolDictionaries:''
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    39
	privateIn:AVLTree
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    40
!
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    41
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    42
!AVLTree class methodsFor:'documentation'!
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    43
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    44
copyright
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    45
"
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    46
  Copyright (c) 2005 Ian Piumarta
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    47
  All rights reserved.
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    48
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    49
  Permission is hereby granted, free of charge, to any person obtaining a
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    50
  copy of this software and associated documentation files (the 'Software'),
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    51
  to deal in the Software without restriction, including without limitation
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    52
  the rights to use, copy, modify, merge, publish, distribute, and/or sell
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    53
  copies of the Software, and to permit persons to whom the Software is
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    54
  furnished to do so, provided that the above copyright notice(s) and this
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    55
  permission notice appear in all copies of the Software and that both the
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    56
  above copyright notice(s) and this permission notice appear in supporting
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    57
  documentation.
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    58
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    59
  THE SOFTWARE IS PROVIDED 'AS IS'.  USE ENTIRELY AT YOUR OWN RISK.
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    60
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    61
  Last edited: 2007-01-25 03:17:27 by piumarta on emilia.local
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    62
"
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    63
!
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    64
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    65
documentation
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    66
"
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    67
    AVLTree -- balanced trees
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    68
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    69
    |t|
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    70
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    71
    t := AVLTree new.
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    72
    self assert:(t depth == 0).
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    73
    self assert:(t size == 0).
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    74
    self assert:(t isEmpty).
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    75
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    76
    t add:'hello'.
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    77
    self assert:(t depth == 0).
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    78
    self assert:(t size == 1).
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    79
    self assert:(t notEmpty).
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    80
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    81
    t add:'world'.
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    82
    self assert:(t depth == 1).
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    83
    self assert:(t size == 2).
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    84
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    85
    t add:'aaa'.
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    86
    self assert:(t depth == 1).
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    87
    self assert:(t size == 3).
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    88
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    89
    t add:'bbb'.
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    90
    self assert:(t depth == 2).
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    91
    self assert:(t size == 4).
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    92
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    93
    self assert:(t printString = 'AVLTree(aaa bbb hello world)').
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    94
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    95
    t remove:'aaa'.
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    96
    self assert:(t printString = 'AVLTree(bbb hello world)').
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    97
    self assert:(t depth == 1).
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    98
    self assert:(t size == 3).
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    99
    
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   100
    | words tree |
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   101
    words := #( Peter Piper picked a peck of pickled peppers
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   102
                A peck of pickled peppers Peter Piper picked
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   103
                If Peter Piper picked a peck of pickled peppers
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   104
                Where is the peck of pickled peppers Peter Piper picked? ).
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   105
    tree := AVLTree new.
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   106
    tree addAll: words.
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   107
    tree printOn:Transcript. Transcript cr; cr.
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   108
    tree := AVLTree withSortBlock: [:a :b | b < a].
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   109
    tree addAll: words.
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   110
    tree printOn:Transcript. Transcript cr; cr.
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   111
"
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   112
! !
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   113
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   114
!AVLTree class methodsFor:'instance creation'!
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   115
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   116
new
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   117
    ^ super new initialize
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   118
!
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   119
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   120
withSortBlock: binaryBlock
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   121
    ^ self new orderBlock:binaryBlock.
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   122
! !
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   123
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   124
!AVLTree methodsFor:'accessing'!
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   125
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   126
orderBlock:aBlock
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   127
    orderBlock := aBlock
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   128
! !
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   129
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   130
!AVLTree methodsFor:'adding & removing'!
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   131
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   132
add: anObject
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   133
    self addNode: (AVLTreeNode withValue: anObject).
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   134
    ^anObject
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   135
!
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   136
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   137
remove: anObject        
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   138
    ^self removeNode: (AVLTreeNode withValue: anObject)
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   139
! !
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   140
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   141
!AVLTree methodsFor:'enumeration'!
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   142
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   143
do: unaryBlock          
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   144
    ^rootNode avlTreeNodeDo: unaryBlock
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   145
!
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   146
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   147
reverseDo: unaryBlock   
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   148
    ^rootNode avlTreeNodeReverseDo: unaryBlock
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   149
! !
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   150
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   151
!AVLTree methodsFor:'initialization'!
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   152
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   153
initialize
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   154
    super initialize.
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   155
    rootNode   := AVLNil.
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   156
    orderBlock := [:a :b | a < b].
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   157
! !
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   158
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   159
!AVLTree methodsFor:'private'!
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   160
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   161
addNode: aNode
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   162
    rootNode := rootNode avlTreeNodeInsert: aNode orderedBy: orderBlock.
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   163
    ^aNode
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   164
!
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   165
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   166
removeNode: aNode       
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   167
    ^rootNode := rootNode avlTreeNodeRemove: aNode orderedBy: orderBlock
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   168
! !
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   169
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   170
!AVLTree methodsFor:'queries'!
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   171
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   172
depth                   
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   173
    ^rootNode avlTreeNodeHeight
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   174
!
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   175
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   176
isEmpty
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   177
    ^rootNode == AVLNil
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   178
!
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   179
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   180
size
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   181
    ^rootNode avlTreeSize
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   182
! !
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   183
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   184
!AVLTree methodsFor:'searching'!
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   185
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   186
find: anObject          
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   187
    ^self findNode: (AVLTreeNode with: anObject)
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   188
!
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   189
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   190
findNode: aNode         
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   191
    ^rootNode avlTreeNodeFind: aNode orderedBy: orderBlock
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   192
! !
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   193
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   194
!AVLTree::AVLNil class methodsFor:'avl polymorphy'!
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   195
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   196
avlTreeNodeDo: unaryBlock
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   197
    ^ nil
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   198
!
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   199
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   200
avlTreeNodeFind: aNode
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   201
    ^AVLNil
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   202
!
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   203
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   204
avlTreeNodeHeight       
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   205
    ^0
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   206
!
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   207
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   208
avlTreeNodeInsert: aNode orderedBy: binaryBlock
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   209
    ^aNode
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   210
!
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   211
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   212
avlTreeNodeMoveRight: aNode
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   213
    ^aNode
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   214
!
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   215
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   216
avlTreeNodeRemove: aNode orderedBy: binaryBlock
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   217
    ^AVLNil
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   218
!
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   219
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   220
avlTreeNodeReverseDo: unaryBlock
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   221
    ^nil
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   222
!
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   223
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   224
avlTreeSize
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   225
    ^0
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   226
! !
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   227
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   228
!AVLTree::AVLTreeNode class methodsFor:'instance creation'!
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   229
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   230
new
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   231
    ^ self basicNew initialize.
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   232
!
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   233
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   234
withValue: anObject
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   235
    ^ self new value:anObject.
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   236
! !
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   237
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   238
!AVLTree::AVLTreeNode methodsFor:'accessing'!
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   239
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   240
height
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   241
    ^ height
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   242
!
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   243
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   244
left
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   245
    ^ left
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   246
!
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   247
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   248
left:something
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   249
    left := something.
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   250
!
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   251
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   252
right
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   253
    ^ right
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   254
!
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   255
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   256
right:something
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   257
    right := something.
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   258
!
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   259
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   260
value
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   261
    ^ value
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   262
!
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   263
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   264
value:anObject
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   265
    value := anObject
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   266
! !
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   267
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   268
!AVLTree::AVLTreeNode methodsFor:'adding & removing'!
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   269
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   270
avlTreeNodeRemove: aNode orderedBy: binaryBlock
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   271
    (aNode equals: self orderedBy: binaryBlock)
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   272
        ifTrue:
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   273
           [| temp |
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   274
            temp := left avlTreeNodeMoveRight: right.
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   275
            left := right := AVLTree::AVLNil.
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   276
            ^temp].
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   277
    (aNode precedes: self orderedBy: binaryBlock)
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   278
        ifTrue:  [left  := left  avlTreeNodeRemove: aNode orderedBy: binaryBlock]
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   279
        ifFalse: [right := right avlTreeNodeRemove: aNode orderedBy: binaryBlock].
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   280
    ^self balance
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   281
! !
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   282
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   283
!AVLTree::AVLTreeNode methodsFor:'enumeration'!
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   284
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   285
avlTreeNodeDo: unaryBlock
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   286
    left avlTreeNodeDo: unaryBlock.
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   287
    unaryBlock value: value.
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   288
    right avlTreeNodeDo: unaryBlock.
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   289
!
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   290
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   291
avlTreeNodeReverseDo: unaryBlock
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   292
    right avlTreeNodeReverseDo: unaryBlock.
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   293
    unaryBlock value: value.
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   294
    left avlTreeNodeReverseDo: unaryBlock.
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   295
! !
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   296
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   297
!AVLTree::AVLTreeNode methodsFor:'initialization'!
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   298
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   299
initialize
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   300
    left := right := AVLTree::AVLNil.
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   301
    height := 0.
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   302
    value := nil.
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   303
! !
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   304
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   305
!AVLTree::AVLTreeNode methodsFor:'misc'!
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   306
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   307
avlTreeNodeFind: aNode orderedBy: binaryBlock
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   308
    (self equals:aNode orderedBy: binaryBlock) ifTrue: [^self].
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   309
    ^(aNode precedes: self orderedBy: binaryBlock)
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   310
        ifTrue:  [left  avlTreeNodeFind: aNode orderedBy: binaryBlock]
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   311
        ifFalse: [right avlTreeNodeFind: aNode orderedBy: binaryBlock]
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   312
!
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   313
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   314
avlTreeNodeMoveRight: aNode
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   315
    right := right avlTreeNodeMoveRight: aNode.
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   316
    ^self balance
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   317
! !
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   318
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   319
!AVLTree::AVLTreeNode methodsFor:'printing & storing'!
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   320
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   321
printOn: aStream
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   322
    super printOn: aStream.
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   323
    aStream
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   324
        nextPut: $(;
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   325
        print: value;
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   326
        nextPut: $)
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   327
! !
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   328
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   329
!AVLTree::AVLTreeNode methodsFor:'private'!
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   330
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   331
balance
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   332
    | delta |
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   333
    delta := self delta.
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   334
    delta < -1
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   335
        ifTrue:
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   336
           [right delta > 0 ifTrue: [right := right rotateRight].
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   337
            ^self rotateLeft].
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   338
    delta > 1
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   339
        ifTrue:
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   340
           [left delta < 0 ifTrue: [left := left rotateLeft].
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   341
            ^self rotateRight].
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   342
    height := 0.
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   343
    (left avlTreeNodeHeight > height) ifTrue: [height := left  avlTreeNodeHeight].
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   344
    (right avlTreeNodeHeight > height) ifTrue: [height := right avlTreeNodeHeight].
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   345
    height := height + 1.
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   346
!
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   347
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   348
rotateLeft
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   349
    | pivot |
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   350
    pivot := right.
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   351
    right := pivot left.
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   352
    pivot left: self balance.
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   353
    ^pivot balance
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   354
!
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   355
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   356
rotateRight
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   357
    | pivot |
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   358
    pivot := left.
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   359
    left := pivot right.
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   360
    pivot right: self balance.
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   361
    ^pivot balance
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   362
! !
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   363
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   364
!AVLTree::AVLTreeNode methodsFor:'queries'!
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   365
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   366
avlTreeNodeHeight           
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   367
    ^height 
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   368
!
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   369
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   370
avlTreeNodeInsert: aNode orderedBy: binaryBlock
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   371
    (aNode precedes: self orderedBy: binaryBlock)
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   372
        ifTrue:  [left  := left  avlTreeNodeInsert: aNode orderedBy: binaryBlock]
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   373
        ifFalse: [right := right avlTreeNodeInsert: aNode orderedBy: binaryBlock].
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   374
    ^self balance
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   375
!
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   376
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   377
avlTreeSize
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   378
    ^ (left avlTreeSize) + 1 + (right avlTreeSize)
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   379
!
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   380
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   381
delta                       
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   382
    ^ (left avlTreeNodeHeight) - (right avlTreeNodeHeight)
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   383
!
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   384
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   385
equals: aNode orderedBy: binaryBlock
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   386
    | l r lr rl |
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   387
    l  := self value.
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   388
    r  := aNode value.
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   389
    lr := binaryBlock value: l value: r.
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   390
    rl := binaryBlock value: r value: l.
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   391
    "Partial order (<=): l = r  =>      (l <= r) and     (l >= r)  =>       lr  and      rl."
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   392
    "Strict  order (< ): l = r  =>  not (l <  r) and not (l >  r)  =>  not (lr) and not (rl)."
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   393
    "Augustus tells us the latter really means l = r  =>  not (lr or rl), saving us one send."
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   394
    ^(lr and: [rl]) or: [(lr or: [rl]) not]
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   395
!
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   396
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   397
precedes: aNode orderedBy: binaryBlock      
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   398
    ^ binaryBlock value: (self value) value: (aNode value)
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   399
! !
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   400
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   401
!AVLTree class methodsFor:'documentation'!
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   402
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   403
version
2765
4d2b566e062f category changes
Claus Gittinger <cg@exept.de>
parents: 1931
diff changeset
   404
    ^ '$Header: /cvs/stx/stx/libbasic2/AVLTree.st,v 1.2 2012-08-05 09:30:47 cg Exp $'
1931
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   405
! !