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