AVLTree.st
author Claus Gittinger <cg@exept.de>
Tue, 25 Jun 2019 14:28:51 +0200
changeset 5050 44fa8672d102
parent 4267 0808f2e18115
child 5144 76e42c1c457f
permissions -rw-r--r--
#DOCUMENTATION by cg class: SharedQueue comment/format in: #next #nextWithTimeout:
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
4115
2fc42df540e6 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 2765
diff changeset
    21
"{ NameSpace: Smalltalk }"
2fc42df540e6 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 2765
diff changeset
    22
1931
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    23
SequenceableCollection subclass:#AVLTree
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    24
	instanceVariableNames:'rootNode orderBlock'
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    25
	classVariableNames:''
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    26
	poolDictionaries:''
2765
4d2b566e062f category changes
Claus Gittinger <cg@exept.de>
parents: 1931
diff changeset
    27
	category:'Collections-Ordered-Trees'
1931
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    28
!
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    29
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    30
Object subclass:#AVLNil
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    31
	instanceVariableNames:''
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    32
	classVariableNames:''
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    33
	poolDictionaries:''
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    34
	privateIn:AVLTree
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    35
!
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    36
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    37
Object subclass:#AVLTreeNode
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    38
	instanceVariableNames:'left right height value'
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    39
	classVariableNames:''
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    40
	poolDictionaries:''
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    41
	privateIn:AVLTree
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    42
!
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    43
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    44
!AVLTree class methodsFor:'documentation'!
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
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    47
"
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    48
  Copyright (c) 2005 Ian Piumarta
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    49
  All rights reserved.
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    50
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    51
  Permission is hereby granted, free of charge, to any person obtaining a
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    52
  copy of this software and associated documentation files (the 'Software'),
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    53
  to deal in the Software without restriction, including without limitation
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    54
  the rights to use, copy, modify, merge, publish, distribute, and/or sell
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    55
  copies of the Software, and to permit persons to whom the Software is
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    56
  furnished to do so, provided that the above copyright notice(s) and this
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    57
  permission notice appear in all copies of the Software and that both the
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    58
  above copyright notice(s) and this permission notice appear in supporting
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    59
  documentation.
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    60
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    61
  THE SOFTWARE IS PROVIDED 'AS IS'.  USE ENTIRELY AT YOUR OWN RISK.
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    62
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    63
  Last edited: 2007-01-25 03:17:27 by piumarta on emilia.local
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    64
"
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    65
!
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    66
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    67
documentation
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    68
"
4115
2fc42df540e6 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 2765
diff changeset
    69
    AVLTree -- balanced trees.
1931
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    70
4115
2fc42df540e6 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 2765
diff changeset
    71
    This implements another kind of self-balancing tree, named after their inventors,
2fc42df540e6 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 2765
diff changeset
    72
    AVLTree is obsoleted by AATree, which has the same best/worst/average characteristics 
2fc42df540e6 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 2765
diff changeset
    73
    (it is also self-balancing), but is always faster (roughly by a factor of 1.5 to 2).
2fc42df540e6 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 2765
diff changeset
    74
    
2fc42df540e6 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 2765
diff changeset
    75
    Consider using an AATree instead.
2fc42df540e6 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 2765
diff changeset
    76
    (unless a special situation arises, of which we don't know yet)
2fc42df540e6 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 2765
diff changeset
    77
2fc42df540e6 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 2765
diff changeset
    78
    [see also:]
4140
40019372db6c #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 4117
diff changeset
    79
        AATree
40019372db6c #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 4117
diff changeset
    80
        BTree
40019372db6c #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 4117
diff changeset
    81
        SortedCollection
4115
2fc42df540e6 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 2765
diff changeset
    82
        https://en.wikipedia.org/wiki/AVL_tree
2fc42df540e6 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 2765
diff changeset
    83
2fc42df540e6 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 2765
diff changeset
    84
    Examples:
2fc42df540e6 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 2765
diff changeset
    85
    
1931
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    86
    |t|
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    87
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    88
    t := AVLTree new.
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    89
    self assert:(t depth == 0).
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    90
    self assert:(t size == 0).
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    91
    self assert:(t isEmpty).
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    92
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    93
    t add:'hello'.
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    94
    self assert:(t depth == 0).
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    95
    self assert:(t size == 1).
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    96
    self assert:(t notEmpty).
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    97
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    98
    t add:'world'.
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    99
    self assert:(t depth == 1).
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   100
    self assert:(t size == 2).
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   101
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   102
    t add:'aaa'.
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   103
    self assert:(t depth == 1).
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   104
    self assert:(t size == 3).
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   105
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   106
    t add:'bbb'.
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   107
    self assert:(t depth == 2).
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   108
    self assert:(t size == 4).
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   109
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   110
    self assert:(t printString = 'AVLTree(aaa bbb hello world)').
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   111
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   112
    t remove:'aaa'.
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   113
    self assert:(t printString = 'AVLTree(bbb hello world)').
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   114
    self assert:(t depth == 1).
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   115
    self assert:(t size == 3).
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   116
    
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   117
    | words tree |
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   118
    words := #( Peter Piper picked a peck of pickled peppers
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   119
                A peck of pickled peppers Peter Piper picked
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   120
                If Peter Piper picked a peck of pickled peppers
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   121
                Where is the peck of pickled peppers Peter Piper picked? ).
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   122
    tree := AVLTree new.
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   123
    tree addAll: words.
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   124
    tree printOn:Transcript. Transcript cr; cr.
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   125
    tree := AVLTree withSortBlock: [:a :b | b < a].
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   126
    tree addAll: words.
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   127
    tree printOn:Transcript. Transcript cr; cr.
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   128
"
4117
edda418517c4 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4115
diff changeset
   129
!
edda418517c4 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4115
diff changeset
   130
edda418517c4 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4115
diff changeset
   131
performance
edda418517c4 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4115
diff changeset
   132
"
edda418517c4 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4115
diff changeset
   133
    Time to insert random 1000000 into SortedCollection: 840ms
edda418517c4 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4115
diff changeset
   134
    Time to insert random 1000000 into BinaryTree: 2040ms
edda418517c4 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4115
diff changeset
   135
    Time to insert random 1000000 into AATree: 3060ms
edda418517c4 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4115
diff changeset
   136
    Time to insert random 1000000 into AVLTree: 3780ms
edda418517c4 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4115
diff changeset
   137
    
edda418517c4 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4115
diff changeset
   138
    Time to insert ordered 1000000 into SortedCollection: 30ms
edda418517c4 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4115
diff changeset
   139
    Time to insert ordered 1000000 into BinaryTree: 72200ms
edda418517c4 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4115
diff changeset
   140
    Time to insert ordered 1000000 into AATree: 110ms
edda418517c4 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4115
diff changeset
   141
    Time to insert ordered 1000000 into AVLTree: 180ms
edda418517c4 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4115
diff changeset
   142
edda418517c4 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4115
diff changeset
   143
    Time to insert reverse ordered 1000000 into SortedCollection: 30ms
edda418517c4 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4115
diff changeset
   144
    Time to insert reverse ordered 1000000 into BinaryTree: 73880ms
edda418517c4 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4115
diff changeset
   145
    Time to insert reverse ordered 1000000 into AATree: 80ms
edda418517c4 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4115
diff changeset
   146
    Time to insert reverse ordered 1000000 into AVLTree: 160ms
edda418517c4 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4115
diff changeset
   147
"
1931
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   148
! !
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   149
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   150
!AVLTree class methodsFor:'instance creation'!
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   151
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   152
new
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   153
    ^ super new initialize
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   154
!
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   155
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   156
withSortBlock: binaryBlock
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   157
    ^ self new orderBlock:binaryBlock.
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   158
! !
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   159
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   160
!AVLTree methodsFor:'accessing'!
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   161
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   162
orderBlock:aBlock
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   163
    orderBlock := aBlock
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
!AVLTree methodsFor:'adding & removing'!
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   167
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   168
add: anObject
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   169
    self addNode: (AVLTreeNode withValue: anObject).
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   170
    ^anObject
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   171
!
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   172
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   173
remove: anObject        
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   174
    ^self removeNode: (AVLTreeNode withValue: anObject)
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   175
! !
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   176
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   177
!AVLTree methodsFor:'enumeration'!
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   178
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   179
do: unaryBlock          
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   180
    ^rootNode avlTreeNodeDo: unaryBlock
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   181
!
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   182
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   183
reverseDo: unaryBlock   
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   184
    ^rootNode avlTreeNodeReverseDo: unaryBlock
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   185
! !
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   186
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   187
!AVLTree methodsFor:'initialization'!
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   188
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   189
initialize
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   190
    super initialize.
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   191
    rootNode   := AVLNil.
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   192
    orderBlock := [:a :b | a < b].
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   193
! !
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   194
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   195
!AVLTree methodsFor:'private'!
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   196
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   197
addNode: aNode
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   198
    rootNode := rootNode avlTreeNodeInsert: aNode orderedBy: orderBlock.
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   199
    ^aNode
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   200
!
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   201
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   202
removeNode: aNode       
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   203
    ^rootNode := rootNode avlTreeNodeRemove: aNode orderedBy: orderBlock
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   204
! !
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   205
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   206
!AVLTree methodsFor:'queries'!
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   207
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   208
depth                   
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   209
    ^rootNode avlTreeNodeHeight
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
isEmpty
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   213
    ^rootNode == AVLNil
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
size
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   217
    ^rootNode avlTreeSize
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
!AVLTree methodsFor:'searching'!
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   221
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   222
find: anObject          
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   223
    ^self findNode: (AVLTreeNode with: anObject)
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   224
!
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   225
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   226
findNode: aNode         
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   227
    ^rootNode avlTreeNodeFind: aNode orderedBy: orderBlock
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   228
! !
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   229
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   230
!AVLTree::AVLNil class methodsFor:'avl polymorphy'!
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   231
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   232
avlTreeNodeDo: unaryBlock
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   233
    ^ nil
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   234
!
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   235
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   236
avlTreeNodeFind: aNode
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   237
    ^AVLNil
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   238
!
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   239
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   240
avlTreeNodeHeight       
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   241
    ^0
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
avlTreeNodeInsert: aNode orderedBy: binaryBlock
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   245
    ^aNode
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
avlTreeNodeMoveRight: aNode
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   249
    ^aNode
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
avlTreeNodeRemove: aNode orderedBy: binaryBlock
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   253
    ^AVLNil
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
avlTreeNodeReverseDo: unaryBlock
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   257
    ^nil
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
avlTreeSize
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   261
    ^0
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
!AVLTree::AVLTreeNode class methodsFor:'instance creation'!
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   265
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   266
new
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   267
    ^ self basicNew initialize.
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   268
!
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   269
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   270
withValue: anObject
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   271
    ^ self new value:anObject.
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   272
! !
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   273
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   274
!AVLTree::AVLTreeNode methodsFor:'accessing'!
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   275
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   276
height
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   277
    ^ height
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   278
!
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   279
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   280
left
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   281
    ^ left
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   282
!
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   283
4267
0808f2e18115 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4140
diff changeset
   284
left:aTreeNode
0808f2e18115 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4140
diff changeset
   285
    left := aTreeNode.
1931
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   286
!
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   287
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   288
right
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   289
    ^ right
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   290
!
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   291
4267
0808f2e18115 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4140
diff changeset
   292
right:aTreeNode
0808f2e18115 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4140
diff changeset
   293
    right := aTreeNode.
1931
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   294
!
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   295
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   296
value
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   297
    ^ value
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   298
!
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   299
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   300
value:anObject
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   301
    value := anObject
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   302
! !
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   303
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   304
!AVLTree::AVLTreeNode methodsFor:'adding & removing'!
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   305
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   306
avlTreeNodeRemove: aNode orderedBy: binaryBlock
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   307
    (aNode equals: self orderedBy: binaryBlock)
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   308
        ifTrue:
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   309
           [| temp |
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   310
            temp := left avlTreeNodeMoveRight: right.
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   311
            left := right := AVLTree::AVLNil.
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   312
            ^temp].
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   313
    (aNode precedes: self orderedBy: binaryBlock)
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   314
        ifTrue:  [left  := left  avlTreeNodeRemove: aNode orderedBy: binaryBlock]
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   315
        ifFalse: [right := right avlTreeNodeRemove: aNode orderedBy: binaryBlock].
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:'enumeration'!
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   320
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   321
avlTreeNodeDo: unaryBlock
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   322
    left avlTreeNodeDo: unaryBlock.
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   323
    unaryBlock value: value.
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   324
    right avlTreeNodeDo: unaryBlock.
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   325
!
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   326
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   327
avlTreeNodeReverseDo: unaryBlock
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   328
    right avlTreeNodeReverseDo: unaryBlock.
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   329
    unaryBlock value: value.
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   330
    left avlTreeNodeReverseDo: unaryBlock.
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   331
! !
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   332
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   333
!AVLTree::AVLTreeNode methodsFor:'initialization'!
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   334
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   335
initialize
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   336
    left := right := AVLTree::AVLNil.
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   337
    height := 0.
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   338
    value := nil.
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   339
! !
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   340
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   341
!AVLTree::AVLTreeNode methodsFor:'misc'!
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   342
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   343
avlTreeNodeFind: aNode orderedBy: binaryBlock
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   344
    (self equals:aNode orderedBy: binaryBlock) ifTrue: [^self].
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   345
    ^(aNode precedes: self orderedBy: binaryBlock)
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   346
        ifTrue:  [left  avlTreeNodeFind: aNode orderedBy: binaryBlock]
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   347
        ifFalse: [right avlTreeNodeFind: aNode orderedBy: binaryBlock]
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   348
!
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   349
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   350
avlTreeNodeMoveRight: aNode
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   351
    right := right avlTreeNodeMoveRight: aNode.
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   352
    ^self balance
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   353
! !
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   354
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   355
!AVLTree::AVLTreeNode methodsFor:'printing & storing'!
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   356
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   357
printOn: aStream
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   358
    super printOn: aStream.
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   359
    aStream
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   360
        nextPut: $(;
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   361
        print: value;
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   362
        nextPut: $)
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   363
! !
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   364
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   365
!AVLTree::AVLTreeNode methodsFor:'private'!
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   366
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   367
balance
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   368
    | delta |
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   369
    delta := self delta.
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   370
    delta < -1
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   371
        ifTrue:
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   372
           [right delta > 0 ifTrue: [right := right rotateRight].
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   373
            ^self rotateLeft].
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   374
    delta > 1
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   375
        ifTrue:
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   376
           [left delta < 0 ifTrue: [left := left rotateLeft].
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   377
            ^self rotateRight].
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   378
    height := 0.
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   379
    (left avlTreeNodeHeight > height) ifTrue: [height := left  avlTreeNodeHeight].
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   380
    (right avlTreeNodeHeight > height) ifTrue: [height := right avlTreeNodeHeight].
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   381
    height := height + 1.
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   382
!
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   383
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   384
rotateLeft
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   385
    | pivot |
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   386
    pivot := right.
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   387
    right := pivot left.
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   388
    pivot left: self balance.
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   389
    ^pivot balance
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   390
!
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   391
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   392
rotateRight
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   393
    | pivot |
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   394
    pivot := left.
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   395
    left := pivot right.
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   396
    pivot right: self balance.
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   397
    ^pivot balance
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   398
! !
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   399
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   400
!AVLTree::AVLTreeNode methodsFor:'queries'!
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   401
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   402
avlTreeNodeHeight           
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   403
    ^height 
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   404
!
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   405
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   406
avlTreeNodeInsert: aNode orderedBy: binaryBlock
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   407
    (aNode precedes: self orderedBy: binaryBlock)
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   408
        ifTrue:  [left  := left  avlTreeNodeInsert: aNode orderedBy: binaryBlock]
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   409
        ifFalse: [right := right avlTreeNodeInsert: aNode orderedBy: binaryBlock].
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   410
    ^self balance
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   411
!
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   412
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   413
avlTreeSize
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   414
    ^ (left avlTreeSize) + 1 + (right avlTreeSize)
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   415
!
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   416
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   417
delta                       
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   418
    ^ (left avlTreeNodeHeight) - (right avlTreeNodeHeight)
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   419
!
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   420
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   421
equals: aNode orderedBy: binaryBlock
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   422
    | l r lr rl |
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   423
    l  := self value.
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   424
    r  := aNode value.
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   425
    lr := binaryBlock value: l value: r.
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   426
    rl := binaryBlock value: r value: l.
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   427
    "Partial order (<=): l = r  =>      (l <= r) and     (l >= r)  =>       lr  and      rl."
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   428
    "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
   429
    "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
   430
    ^(lr and: [rl]) or: [(lr or: [rl]) not]
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   431
!
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   432
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   433
precedes: aNode orderedBy: binaryBlock      
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   434
    ^ binaryBlock value: (self value) value: (aNode value)
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   435
! !
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   436
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   437
!AVLTree class methodsFor:'documentation'!
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   438
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   439
version
4115
2fc42df540e6 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 2765
diff changeset
   440
    ^ '$Header$'
4117
edda418517c4 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4115
diff changeset
   441
!
edda418517c4 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4115
diff changeset
   442
edda418517c4 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4115
diff changeset
   443
version_CVS
edda418517c4 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4115
diff changeset
   444
    ^ '$Header$'
1931
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   445
! !
4115
2fc42df540e6 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 2765
diff changeset
   446