BinaryTreeNode.st
author Claus Gittinger <cg@exept.de>
Sun, 05 Aug 2012 19:22:31 +0200
changeset 2781 bf6e167105ee
parent 2778 7f379c407160
child 2784 c81c8066f444
permissions -rw-r--r--
changed: #version #version_CVS
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
2778
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     1
"
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     2
    Public domain (1996 published in c.l.s) no limitation on use.
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     3
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     4
    This class is provided as-is, without any warranty. 
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     5
    It is not part of or covered by the ST/X copyright.
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     6
"
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     7
"{ Package: 'stx:libbasic2' }"
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     8
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     9
Object subclass:#BinaryTreeNode
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    10
	instanceVariableNames:'data leftSubtree rightSubtree'
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    11
	classVariableNames:''
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    12
	poolDictionaries:''
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    13
	category:'Collections-Ordered-Trees'
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    14
!
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    15
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    16
!BinaryTreeNode class methodsFor:'documentation'!
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    17
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    18
copyright
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    19
"
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    20
    Public domain (1996 published in c.l.s) no limitation on use.
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    21
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    22
    This class is provided as-is, without any warranty. 
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    23
    It is not part of or covered by the ST/X copyright.
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    24
"
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    25
!
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    26
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    27
documentation
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    28
"
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    29
    goody from comp.lang.smalltalk;
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    30
    original header:
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    31
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    32
        Here's a complete implementation of a binary tree class:
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    33
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    34
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    35
    [organization:]
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    36
        The National Capital FreeNet, Ottawa, Ontario, Canada
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    37
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    38
    [author:]
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    39
        al938@FreeNet.Carleton.CA (Steve Chepurny)
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    40
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    41
    [see also:]
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    42
        LinkedList Chain
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    43
        Link ValueLink ChainLink
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    44
"
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    45
!
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    46
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    47
examples
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    48
"
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    49
  manual building of a tree (but see BinaryTree for a collection-facade):
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    50
                                                                        [exBegin]
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    51
    |tree|
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    52
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    53
    tree := BinaryTreeNode data:2.
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    54
    tree leftSubtree:(BinaryTreeNode new data:1).
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    55
    tree rightSubtree:(BinaryTreeNode new data:3).
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    56
    tree printOn:Transcript.
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    57
                                                                        [exEnd]
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    58
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    59
  insertion:
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    60
                                                                        [exBegin]
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    61
    |tree|
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    62
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    63
    tree := BinaryTreeNode data:'hello'.
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    64
    #('the' 'quick' 'brown' 'fox' 'jumps' 'over' 'the' 'lazy' 'dogs')
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    65
    do:[:word |
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    66
        tree insert:(BinaryTreeNode data:word).
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    67
    ].
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    68
    tree inOrderDo:[:node |
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    69
        Transcript showCR:node data
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    70
    ]
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    71
                                                                        [exEnd]
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    72
"
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    73
! !
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    74
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    75
!BinaryTreeNode class methodsFor:'instance creation'!
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    76
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    77
data:data
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    78
    "Returns a new binary tree node, holding data"
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    79
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    80
    ^ self basicNew data:data
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    81
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    82
    "Modified: 10.5.1996 / 15:00:13 / cg"
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    83
    "Created: 10.5.1996 / 15:00:35 / cg"
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    84
!
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    85
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    86
empty
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    87
    "Returns a new binary tree with subtrees as binary tree nodes"
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    88
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    89
    ^ self new
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    90
	    leftSubtree: self new;
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    91
	    rightSubtree: self new
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    92
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    93
    "Modified: 10.5.1996 / 15:00:02 / cg"
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    94
! !
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    95
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    96
!BinaryTreeNode methodsFor:'accessing'!
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    97
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    98
data
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    99
    ^ data
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   100
!
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   101
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   102
data:anObject 
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   103
    data := anObject
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   104
!
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   105
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   106
leftSubtree
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   107
    ^leftSubtree
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   108
!
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   109
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   110
leftSubtree: aBinaryTree
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   111
    leftSubtree := aBinaryTree
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   112
!
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   113
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   114
nextNodeInOrder
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   115
    "return the node holding the next value"
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   116
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   117
    ^ rightSubtree leftMostNode
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   118
!
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   119
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   120
predecessor
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   121
    "return the previous value"
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   122
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   123
    ^ self prevNodeInOrder data
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   124
!
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   125
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   126
prevNodeInOrder
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   127
    "return the node holding the previous value"
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   128
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   129
    ^ leftSubtree rightMostNode
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   130
!
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   131
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   132
rightSubtree
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   133
    ^rightSubtree
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   134
!
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   135
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   136
rightSubtree: aBinaryTree
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   137
    rightSubtree := aBinaryTree
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   138
!
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   139
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   140
successor
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   141
    "return the next value"
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   142
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   143
    ^ self nextNodeInOrder data
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   144
! !
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   145
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   146
!BinaryTreeNode methodsFor:'enumeration'!
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   147
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   148
do: aBlock
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   149
    "applies aBlock to each element's data in the binary tree in inorder"
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   150
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   151
    self inOrderDo:[:eachNode | aBlock value:eachNode data]
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   152
!
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   153
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   154
inOrderDo:aBlock
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   155
    "Traverses the elements of the binary tree in
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   156
        LEFT - ROOT - RIGHT order, 
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   157
     applying a block to each node.
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   158
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   159
     We use an interative approach here, to avoid VM stack overflow"
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   160
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   161
    |nextNode stack|
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   162
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   163
    stack := Stack new.
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   164
    nextNode := self.
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   165
    [
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   166
        |left|
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   167
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   168
        stack push:nextNode.
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   169
        left := nextNode leftSubtree.
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   170
        left isNil ifTrue:[
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   171
            [
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   172
                stack isEmpty ifTrue:[
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   173
                    ^ self
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   174
                ].
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   175
                nextNode := stack pop.
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   176
                aBlock value:nextNode.
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   177
                nextNode := nextNode rightSubtree.
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   178
            ] doWhile:[nextNode isNil]
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   179
        ] ifFalse:[
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   180
            nextNode := left.
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   181
        ].
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   182
    ] loop.
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   183
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   184
    "
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   185
      BinaryTree withAll:#(2 16 3 1 0 4 7 9)
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   186
    "
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   187
!
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   188
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   189
postOrderDo: aBlock
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   190
    "Traverses the elements of the binary tree in
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   191
        LEFT - RIGHT - ROOT order, 
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   192
     applying a block to each node"
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   193
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   194
    leftSubtree notNil ifTrue:[
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   195
        leftSubtree postOrderDo: aBlock
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   196
    ].
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   197
    rightSubtree notNil ifTrue:[
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   198
        rightSubtree postOrderDo: aBlock
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   199
    ].
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   200
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   201
    aBlock value: self.
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   202
!
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   203
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   204
preOrderDo: aBlock
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   205
    "Traverses the elements of the binary tree in
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   206
        ROOT - LEFT - RIGHT order, 
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   207
     applying a block to each node"
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   208
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   209
    aBlock value: self.
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   210
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   211
    leftSubtree notNil ifTrue:[
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   212
        leftSubtree preOrderDo: aBlock
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   213
    ].
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   214
    rightSubtree notNil ifTrue:[
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   215
        rightSubtree preOrderDo: aBlock
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   216
    ].
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   217
! !
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   218
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   219
!BinaryTreeNode methodsFor:'insert & delete'!
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   220
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   221
insert:aBinaryTreeNode
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   222
    "insert a node, comparing nodes using a default sort rule"
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   223
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   224
    ^ self
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   225
        insert:aBinaryTreeNode
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   226
        sortBlock:[:a :b | a < b]
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   227
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   228
    "Modified: 10.5.1996 / 15:08:30 / cg"
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   229
    "Created: 10.5.1996 / 15:09:44 / cg"
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   230
!
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   231
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   232
insert:newBinaryTreeNode sortBlock:sortBlock
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   233
    "insert a node, comparing nodes using sortBlock"
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   234
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   235
    |node newValue left right|
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   236
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   237
    "/ the following might be ugly - however, it it slightly faster than the stuff below.
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   238
    "/ AND it does not suffer stack exhaustion....
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   239
    "/ (we MUST have LCO in smalltalk for this to be automatically faster
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   240
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   241
    node := self.
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   242
    newValue := newBinaryTreeNode data.
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   243
    [true] whileTrue:[
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   244
        "newValue is less the node data"
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   245
        (sortBlock value:newValue value:node data) ifTrue:[
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   246
            left := node leftSubtree.
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   247
            left isNil ifTrue:[
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   248
                node leftSubtree:newBinaryTreeNode.
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   249
                ^ self
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   250
            ].
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   251
            node := left
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   252
        ] ifFalse:[
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   253
            "newValue is larger or equal than node data"
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   254
            right := node rightSubtree.
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   255
            "if right data is less than node, we would be jumping back..."
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   256
            right isNil ifTrue:[
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   257
                node rightSubtree:newBinaryTreeNode.
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   258
                ^ self
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   259
            ].
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   260
            node := right
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   261
        ]
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   262
    ].
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   263
    "not reached"
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   264
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   265
"/    (sortBlock value:newBinaryTreeNode data value:data) ifTrue:[
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   266
"/        leftSubtree isNil ifTrue:[
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   267
"/            leftSubtree := newBinaryTreeNode.
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   268
"/        ] ifFalse:[
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   269
"/            leftSubtree insert:newBinaryTreeNode sortBlock:sortBlock
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   270
"/        ]
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   271
"/    ] ifFalse:[
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   272
"/        rightSubtree isNil ifTrue:[
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   273
"/            rightSubtree := newBinaryTreeNode.
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   274
"/        ] ifFalse:[
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   275
"/            rightSubtree insert:newBinaryTreeNode sortBlock:sortBlock
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   276
"/        ]
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   277
"/    ]
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   278
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   279
    "
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   280
     BinaryTree withAll:#(16 3 1 0 4 7 9)             
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   281
    "
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   282
! !
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   283
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   284
!BinaryTreeNode methodsFor:'printing'!
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   285
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   286
printOn: aStream
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   287
    "Append the ascii representation to aStream"
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   288
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   289
    data isNil
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   290
        ifTrue: [aStream nextPutAll: '--']
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   291
        ifFalse: [
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   292
            aStream nextPut: $(.
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   293
            data printOn: aStream. aStream nextPut: $ .
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   294
            leftSubtree printOn: aStream. aStream nextPut: $ .
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   295
            rightSubtree printOn: aStream.
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   296
            aStream nextPut: $)]
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   297
!
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   298
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   299
printOn:aStream indent:i
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   300
    "Append the graphical ascii representation to aStream"
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   301
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   302
    data isNil
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   303
        ifTrue: [aStream spaces:i. aStream nextPutAll: '--']
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   304
        ifFalse: [
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   305
            aStream spaces:i. aStream nextPut: $(.
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   306
            data printOn: aStream. 
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   307
            aStream cr.
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   308
            leftSubtree isNil 
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   309
                ifTrue:[ aStream spaces:i+2. '--' printOn: aStream]
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   310
                ifFalse:[ leftSubtree printOn: aStream indent:i+2 ]. 
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   311
            aStream cr.
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   312
            rightSubtree isNil 
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   313
                ifTrue:[ aStream spaces:i+2. '--' printOn: aStream]
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   314
                ifFalse:[ rightSubtree printOn: aStream indent:i+2 ]. 
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   315
            aStream nextPut: $)
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   316
        ]
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   317
! !
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   318
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   319
!BinaryTreeNode methodsFor:'private helpers'!
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   320
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   321
removeLeftRightMostNode
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   322
    |rightMost|
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   323
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   324
    leftSubtree rightSubtree isNil ifTrue:[
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   325
        rightMost := leftSubtree.
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   326
        leftSubtree := leftSubtree leftSubtree.
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   327
        ^ rightMost.
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   328
    ].
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   329
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   330
    ^ leftSubtree removeRightMostNode
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   331
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   332
    "
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   333
     |tree|
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   334
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   335
     tree := BinaryTreeNode data:4.
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   336
     #(2 6 1 3 5 7)
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   337
     do:[:word |
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   338
         tree insert:(BinaryTreeNode data:word).
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   339
     ].
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   340
     tree printOn:Transcript indent:0. Transcript cr.
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   341
     '---------------------------' printOn:Transcript. Transcript cr.
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   342
     tree removeLeftRightMostNode.
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   343
     tree printOn:Transcript indent:0. Transcript cr.
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   344
    "
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   345
!
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   346
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   347
removeRightMostNode
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   348
    |right rr parent|
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   349
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   350
    rightSubtree isNil ifTrue:[
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   351
        self error:'should not happen'
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   352
    ].
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   353
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   354
    parent := self.
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   355
    right := rightSubtree.
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   356
    [ (rr := right rightSubtree) notNil ] whileTrue:[
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   357
        parent := right.
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   358
        right := rr.
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   359
    ].
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   360
    parent rightSubtree:(right leftSubtree).
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   361
    ^ right.
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   362
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   363
    "
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   364
     |tree|
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   365
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   366
     tree := BinaryTreeNode data:4.
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   367
     #(2 6 1 3 5 7)
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   368
     do:[:word |
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   369
         tree insert:(BinaryTreeNode data:word).
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   370
     ].
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   371
     Transcript showCR:tree.
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   372
     Transcript showCR:(tree removeLeftRightMostNode). 
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   373
     Transcript showCR:tree.
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   374
    "
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   375
!
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   376
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   377
removeValue:oldValue using:compareOp sortBlock:sortBlock
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   378
    "remove a value - returns a new treeNode, or nil if the value is not in the tree"
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   379
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   380
    |thisIsMyNode newTop newLeft newRight|
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   381
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   382
    "/ speed hack - avoids message sends (and also better inline caching)
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   383
    compareOp == #== ifTrue:[
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   384
        thisIsMyNode := (data == oldValue).
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   385
    ] ifFalse:[
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   386
        compareOp == #= ifTrue:[
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   387
            thisIsMyNode := (data = oldValue).
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   388
        ] ifFalse:[
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   389
            thisIsMyNode := data perform:compareOp with:oldValue.
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   390
        ].
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   391
    ].
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   392
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   393
    thisIsMyNode ifTrue:[
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   394
        leftSubtree isNil ifTrue:[
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   395
            ^ rightSubtree
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   396
        ].
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   397
        rightSubtree isNil ifTrue:[
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   398
            ^ leftSubtree
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   399
        ].
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   400
        newTop := self removeLeftRightMostNode.
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   401
        newTop leftSubtree:leftSubtree.
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   402
        newTop rightSubtree:rightSubtree.
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   403
        ^ newTop.
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   404
    ].
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   405
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   406
    (sortBlock value:oldValue value:data) ifTrue:[
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   407
        "/ the value should be in the left part.
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   408
        leftSubtree isNil ifTrue:[
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   409
            ^ nil
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   410
        ].
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   411
        newLeft := leftSubtree removeValue:oldValue using:compareOp sortBlock:sortBlock.
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   412
        newLeft isNil ifTrue:[
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   413
            (leftSubtree data perform:compareOp with:oldValue) ifFalse:[
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   414
                ^ nil
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   415
            ].
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   416
        ].
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   417
        leftSubtree := newLeft.
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   418
    ] ifFalse:[
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   419
        "/ the value should be in the right part.
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   420
        rightSubtree isNil ifTrue:[
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   421
            ^ nil
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   422
        ].
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   423
        newRight := rightSubtree removeValue:oldValue using:compareOp sortBlock:sortBlock.
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   424
        newRight isNil ifTrue:[
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   425
            (rightSubtree data perform:compareOp with:oldValue) ifFalse:[
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   426
                ^ nil
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   427
            ].
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   428
        ].
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   429
        rightSubtree := newRight.
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   430
    ].
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   431
    ^ self. 
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   432
! !
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   433
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   434
!BinaryTreeNode methodsFor:'queries'!
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   435
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   436
depth
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   437
    "Returns the depth of the binary tree (0 for leafs)"
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   438
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   439
    ^ self level - 1.
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   440
!
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   441
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   442
getTreeWithAnInteger: anInteger
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   443
    "Private - Returns the BinaryTree with data anInteger.  
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   444
     If anInteger not in the tree it returns nil."
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   445
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   446
    self inOrderDo: [:each| each data = anInteger ifTrue:[^each]].
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   447
    ^nil.
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   448
!
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   449
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   450
inOrderSuccessor
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   451
    "Returns the in-order successor the of receiver.
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   452
     (that is the leftMost node on the right side)
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   453
     If receiver is empty then returns the receiver."
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   454
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   455
    rightSubtree isNil ifTrue:[^ self].
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   456
    ^ rightSubtree leftMostNode
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   457
!
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   458
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   459
includesIdenticalValue:aValue sortBlock:sortBlock
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   460
    "return true, if aValue is contained as some node's data"
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   461
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   462
    data == aValue ifTrue:[ ^ true ].
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   463
    (sortBlock value:aValue value:data) ifTrue:[
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   464
        leftSubtree isNil ifTrue:[
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   465
            ^ false
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   466
        ].
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   467
        ^ leftSubtree includesIdenticalValue:aValue sortBlock:sortBlock.
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   468
    ].
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   469
    rightSubtree isNil ifTrue:[
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   470
        ^ false
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   471
    ].
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   472
    ^ rightSubtree includesIdenticalValue:aValue sortBlock:sortBlock.
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   473
!
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   474
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   475
includesValue:aValue sortBlock:sortBlock
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   476
    "return true, if some node's data is equal to aValue"
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   477
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   478
    data = aValue ifTrue:[ ^ true ].
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   479
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   480
    (sortBlock value:aValue value:data) ifTrue:[
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   481
        leftSubtree isNil ifTrue:[
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   482
            ^ false
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   483
        ].
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   484
        ^ leftSubtree includesValue:aValue sortBlock:sortBlock.
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   485
    ].
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   486
    rightSubtree isNil ifTrue:[
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   487
        ^ false
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   488
    ].
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   489
    ^ rightSubtree includesValue:aValue sortBlock:sortBlock.
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   490
!
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   491
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   492
isEmpty
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   493
    "returns true if the binary tree is empty and false otherwise"
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   494
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   495
    ^ data isNil
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   496
!
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   497
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   498
isLeaf
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   499
    "Returns true if self is a leaf"
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   500
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   501
    ^ ((leftSubtree isNil) and: [rightSubtree isNil])
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   502
!
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   503
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   504
leftMostNode
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   505
    "Returns the leftMost (smallest-valued) node"
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   506
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   507
    leftSubtree isNil ifTrue:[^ self].
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   508
    ^ leftSubtree leftMostNode
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   509
!
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   510
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   511
level
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   512
    "Returns the level of the binary tree (1 for leafs)"
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   513
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   514
    |l|
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   515
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   516
    l := 0.
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   517
    leftSubtree notNil ifTrue:[
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   518
        l := leftSubtree level
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   519
    ].
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   520
    rightSubtree notNil ifTrue:[
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   521
        l := l max:(rightSubtree level)
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   522
    ].
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   523
    ^ l + 1
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   524
!
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   525
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   526
rightMostNode
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   527
    "Returns the rightMost (largest-valued) node"
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   528
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   529
    rightSubtree isNil ifTrue:[^ self].
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   530
    ^ rightSubtree rightMostNode
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   531
!
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   532
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   533
size
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   534
    "Returns the size of the binary tree"
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   535
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   536
    ^ 1
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   537
    + (leftSubtree isNil ifTrue: [0] ifFalse:[leftSubtree size])
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   538
    + (rightSubtree isNil ifTrue: [0] ifFalse:[rightSubtree size])
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   539
! !
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   540
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   541
!BinaryTreeNode class methodsFor:'documentation'!
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   542
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   543
version
2781
bf6e167105ee changed:
Claus Gittinger <cg@exept.de>
parents: 2778
diff changeset
   544
    ^ '$Header: /cvs/stx/stx/libbasic2/BinaryTreeNode.st,v 1.7 2012-08-05 17:22:31 cg Exp $'
2778
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   545
!
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   546
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   547
version_CVS
2781
bf6e167105ee changed:
Claus Gittinger <cg@exept.de>
parents: 2778
diff changeset
   548
    ^ '$Header: /cvs/stx/stx/libbasic2/BinaryTreeNode.st,v 1.7 2012-08-05 17:22:31 cg Exp $'
2778
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   549
! !