AVLTree.st
author Claus Gittinger <cg@exept.de>
Thu, 13 Oct 2016 12:22:38 +0200
changeset 4117 edda418517c4
parent 4115 2fc42df540e6
child 4140 40019372db6c
permissions -rw-r--r--
#DOCUMENTATION by cg class: AVLTree added: #performance
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:]
2fc42df540e6 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 2765
diff changeset
    79
        https://en.wikipedia.org/wiki/AVL_tree
2fc42df540e6 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 2765
diff changeset
    80
2fc42df540e6 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 2765
diff changeset
    81
    Examples:
2fc42df540e6 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 2765
diff changeset
    82
    
1931
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    83
    |t|
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 := AVLTree new.
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    86
    self assert:(t depth == 0).
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    87
    self assert:(t size == 0).
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    88
    self assert:(t isEmpty).
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    89
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    90
    t add:'hello'.
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    91
    self assert:(t depth == 0).
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    92
    self assert:(t size == 1).
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    93
    self assert:(t notEmpty).
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 add:'world'.
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    96
    self assert:(t depth == 1).
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    97
    self assert:(t size == 2).
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    98
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    99
    t add:'aaa'.
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   100
    self assert:(t depth == 1).
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   101
    self assert:(t size == 3).
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   102
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   103
    t add:'bbb'.
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   104
    self assert:(t depth == 2).
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   105
    self assert:(t size == 4).
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   106
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   107
    self assert:(t printString = 'AVLTree(aaa bbb hello world)').
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   108
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   109
    t remove:'aaa'.
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   110
    self assert:(t printString = 'AVLTree(bbb hello world)').
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   111
    self assert:(t depth == 1).
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   112
    self assert:(t size == 3).
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   113
    
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   114
    | words tree |
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   115
    words := #( Peter Piper picked a peck of pickled peppers
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   116
                A peck of pickled peppers Peter Piper picked
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   117
                If Peter Piper picked a peck of pickled peppers
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   118
                Where is the peck of pickled peppers Peter Piper picked? ).
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   119
    tree := AVLTree new.
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   120
    tree addAll: words.
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   121
    tree printOn:Transcript. Transcript cr; cr.
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   122
    tree := AVLTree withSortBlock: [:a :b | b < a].
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
"
4117
edda418517c4 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4115
diff changeset
   126
!
edda418517c4 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4115
diff changeset
   127
edda418517c4 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4115
diff changeset
   128
performance
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
    Time to insert random 1000000 into SortedCollection: 840ms
edda418517c4 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4115
diff changeset
   131
    Time to insert random 1000000 into BinaryTree: 2040ms
edda418517c4 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4115
diff changeset
   132
    Time to insert random 1000000 into AATree: 3060ms
edda418517c4 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4115
diff changeset
   133
    Time to insert random 1000000 into AVLTree: 3780ms
edda418517c4 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4115
diff changeset
   134
    
edda418517c4 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4115
diff changeset
   135
    Time to insert ordered 1000000 into SortedCollection: 30ms
edda418517c4 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4115
diff changeset
   136
    Time to insert ordered 1000000 into BinaryTree: 72200ms
edda418517c4 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4115
diff changeset
   137
    Time to insert ordered 1000000 into AATree: 110ms
edda418517c4 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4115
diff changeset
   138
    Time to insert ordered 1000000 into AVLTree: 180ms
edda418517c4 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4115
diff changeset
   139
edda418517c4 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4115
diff changeset
   140
    Time to insert reverse ordered 1000000 into SortedCollection: 30ms
edda418517c4 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4115
diff changeset
   141
    Time to insert reverse ordered 1000000 into BinaryTree: 73880ms
edda418517c4 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4115
diff changeset
   142
    Time to insert reverse ordered 1000000 into AATree: 80ms
edda418517c4 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4115
diff changeset
   143
    Time to insert reverse ordered 1000000 into AVLTree: 160ms
edda418517c4 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4115
diff changeset
   144
"
1931
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
!AVLTree class methodsFor:'instance creation'!
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   148
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   149
new
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   150
    ^ super new initialize
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   151
!
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   152
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   153
withSortBlock: binaryBlock
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   154
    ^ self new orderBlock:binaryBlock.
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   155
! !
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   156
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   157
!AVLTree methodsFor:'accessing'!
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   158
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   159
orderBlock:aBlock
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   160
    orderBlock := aBlock
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   161
! !
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   162
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   163
!AVLTree methodsFor:'adding & removing'!
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   164
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   165
add: anObject
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   166
    self addNode: (AVLTreeNode withValue: anObject).
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   167
    ^anObject
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
remove: anObject        
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   171
    ^self removeNode: (AVLTreeNode withValue: anObject)
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   172
! !
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   173
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   174
!AVLTree methodsFor:'enumeration'!
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   175
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   176
do: unaryBlock          
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   177
    ^rootNode avlTreeNodeDo: unaryBlock
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
reverseDo: unaryBlock   
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   181
    ^rootNode avlTreeNodeReverseDo: unaryBlock
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:'initialization'!
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   185
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   186
initialize
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   187
    super initialize.
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   188
    rootNode   := AVLNil.
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   189
    orderBlock := [:a :b | a < b].
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   190
! !
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   191
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   192
!AVLTree methodsFor:'private'!
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   193
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   194
addNode: aNode
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   195
    rootNode := rootNode avlTreeNodeInsert: aNode orderedBy: orderBlock.
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   196
    ^aNode
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   197
!
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   198
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   199
removeNode: aNode       
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   200
    ^rootNode := rootNode avlTreeNodeRemove: aNode orderedBy: orderBlock
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   201
! !
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   202
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   203
!AVLTree methodsFor:'queries'!
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   204
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   205
depth                   
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   206
    ^rootNode avlTreeNodeHeight
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   207
!
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   208
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   209
isEmpty
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   210
    ^rootNode == AVLNil
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   211
!
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   212
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   213
size
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   214
    ^rootNode avlTreeSize
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   215
! !
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   216
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   217
!AVLTree methodsFor:'searching'!
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   218
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   219
find: anObject          
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   220
    ^self findNode: (AVLTreeNode with: anObject)
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   221
!
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   222
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   223
findNode: aNode         
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   224
    ^rootNode avlTreeNodeFind: aNode orderedBy: orderBlock
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   225
! !
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   226
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   227
!AVLTree::AVLNil class methodsFor:'avl polymorphy'!
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   228
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   229
avlTreeNodeDo: unaryBlock
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   230
    ^ nil
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   231
!
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   232
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   233
avlTreeNodeFind: aNode
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   234
    ^AVLNil
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   235
!
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   236
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   237
avlTreeNodeHeight       
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   238
    ^0
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   239
!
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   240
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   241
avlTreeNodeInsert: aNode orderedBy: binaryBlock
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   242
    ^aNode
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   243
!
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   244
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   245
avlTreeNodeMoveRight: aNode
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   246
    ^aNode
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   247
!
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   248
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   249
avlTreeNodeRemove: aNode orderedBy: binaryBlock
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   250
    ^AVLNil
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   251
!
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   252
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   253
avlTreeNodeReverseDo: unaryBlock
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   254
    ^nil
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   255
!
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   256
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   257
avlTreeSize
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   258
    ^0
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   259
! !
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   260
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   261
!AVLTree::AVLTreeNode class methodsFor:'instance creation'!
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   262
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   263
new
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   264
    ^ self basicNew initialize.
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   265
!
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   266
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   267
withValue: anObject
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   268
    ^ self new value:anObject.
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   269
! !
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   270
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   271
!AVLTree::AVLTreeNode methodsFor:'accessing'!
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   272
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   273
height
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   274
    ^ height
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   275
!
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   276
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   277
left
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   278
    ^ left
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   279
!
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   280
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   281
left:something
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   282
    left := something.
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   283
!
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   284
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   285
right
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   286
    ^ right
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   287
!
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   288
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   289
right:something
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   290
    right := something.
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   291
!
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   292
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   293
value
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   294
    ^ value
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
value:anObject
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   298
    value := anObject
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   299
! !
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   300
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   301
!AVLTree::AVLTreeNode methodsFor:'adding & removing'!
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   302
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   303
avlTreeNodeRemove: aNode orderedBy: binaryBlock
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   304
    (aNode equals: self orderedBy: binaryBlock)
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   305
        ifTrue:
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   306
           [| temp |
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   307
            temp := left avlTreeNodeMoveRight: right.
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   308
            left := right := AVLTree::AVLNil.
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
    (aNode precedes: self orderedBy: binaryBlock)
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   311
        ifTrue:  [left  := left  avlTreeNodeRemove: aNode orderedBy: binaryBlock]
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   312
        ifFalse: [right := right avlTreeNodeRemove: aNode orderedBy: binaryBlock].
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   313
    ^self balance
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   314
! !
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   315
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   316
!AVLTree::AVLTreeNode methodsFor:'enumeration'!
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   317
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   318
avlTreeNodeDo: unaryBlock
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   319
    left avlTreeNodeDo: unaryBlock.
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   320
    unaryBlock value: value.
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   321
    right avlTreeNodeDo: unaryBlock.
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   322
!
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   323
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   324
avlTreeNodeReverseDo: unaryBlock
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   325
    right avlTreeNodeReverseDo: unaryBlock.
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   326
    unaryBlock value: value.
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   327
    left avlTreeNodeReverseDo: unaryBlock.
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   328
! !
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   329
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   330
!AVLTree::AVLTreeNode methodsFor:'initialization'!
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   331
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   332
initialize
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   333
    left := right := AVLTree::AVLNil.
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   334
    height := 0.
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   335
    value := nil.
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   336
! !
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   337
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   338
!AVLTree::AVLTreeNode methodsFor:'misc'!
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   339
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   340
avlTreeNodeFind: aNode orderedBy: binaryBlock
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   341
    (self equals:aNode orderedBy: binaryBlock) ifTrue: [^self].
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   342
    ^(aNode precedes: self orderedBy: binaryBlock)
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   343
        ifTrue:  [left  avlTreeNodeFind: aNode orderedBy: binaryBlock]
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   344
        ifFalse: [right avlTreeNodeFind: aNode orderedBy: binaryBlock]
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   345
!
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   346
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   347
avlTreeNodeMoveRight: aNode
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   348
    right := right avlTreeNodeMoveRight: aNode.
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   349
    ^self balance
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   350
! !
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   351
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   352
!AVLTree::AVLTreeNode methodsFor:'printing & storing'!
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   353
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   354
printOn: aStream
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   355
    super printOn: aStream.
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   356
    aStream
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   357
        nextPut: $(;
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   358
        print: value;
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   359
        nextPut: $)
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   360
! !
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   361
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   362
!AVLTree::AVLTreeNode methodsFor:'private'!
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   363
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   364
balance
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   365
    | delta |
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   366
    delta := self delta.
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   367
    delta < -1
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   368
        ifTrue:
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   369
           [right delta > 0 ifTrue: [right := right rotateRight].
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   370
            ^self rotateLeft].
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   371
    delta > 1
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   372
        ifTrue:
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   373
           [left delta < 0 ifTrue: [left := left rotateLeft].
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   374
            ^self rotateRight].
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   375
    height := 0.
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   376
    (left avlTreeNodeHeight > height) ifTrue: [height := left  avlTreeNodeHeight].
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   377
    (right avlTreeNodeHeight > height) ifTrue: [height := right avlTreeNodeHeight].
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   378
    height := height + 1.
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
rotateLeft
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   382
    | pivot |
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   383
    pivot := right.
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   384
    right := pivot left.
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   385
    pivot left: self balance.
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   386
    ^pivot balance
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   387
!
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   388
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   389
rotateRight
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   390
    | pivot |
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   391
    pivot := left.
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   392
    left := pivot right.
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   393
    pivot right: self balance.
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   394
    ^pivot balance
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
!AVLTree::AVLTreeNode methodsFor:'queries'!
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   398
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   399
avlTreeNodeHeight           
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   400
    ^height 
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   401
!
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   402
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   403
avlTreeNodeInsert: aNode orderedBy: binaryBlock
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   404
    (aNode precedes: self orderedBy: binaryBlock)
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   405
        ifTrue:  [left  := left  avlTreeNodeInsert: aNode orderedBy: binaryBlock]
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   406
        ifFalse: [right := right avlTreeNodeInsert: aNode orderedBy: binaryBlock].
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   407
    ^self balance
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   408
!
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   409
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   410
avlTreeSize
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   411
    ^ (left avlTreeSize) + 1 + (right avlTreeSize)
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   412
!
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   413
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   414
delta                       
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   415
    ^ (left avlTreeNodeHeight) - (right avlTreeNodeHeight)
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   416
!
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   417
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   418
equals: aNode orderedBy: binaryBlock
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   419
    | l r lr rl |
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   420
    l  := self value.
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   421
    r  := aNode value.
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   422
    lr := binaryBlock value: l value: r.
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   423
    rl := binaryBlock value: r value: l.
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   424
    "Partial order (<=): l = r  =>      (l <= r) and     (l >= r)  =>       lr  and      rl."
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   425
    "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
   426
    "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
   427
    ^(lr and: [rl]) or: [(lr or: [rl]) not]
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   428
!
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   429
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   430
precedes: aNode orderedBy: binaryBlock      
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   431
    ^ binaryBlock value: (self value) value: (aNode value)
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   432
! !
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   433
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   434
!AVLTree class methodsFor:'documentation'!
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   435
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   436
version
4115
2fc42df540e6 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 2765
diff changeset
   437
    ^ '$Header$'
4117
edda418517c4 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4115
diff changeset
   438
!
edda418517c4 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4115
diff changeset
   439
edda418517c4 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4115
diff changeset
   440
version_CVS
edda418517c4 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4115
diff changeset
   441
    ^ '$Header$'
1931
00a0d32ed23b initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   442
! !
4115
2fc42df540e6 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 2765
diff changeset
   443