BinaryTreeNode.st
author Claus Gittinger <cg@exept.de>
Thu, 09 Jun 2016 17:48:53 +0200
changeset 3928 d1133788cbba
parent 2973 8b088e07f602
child 4292 b9bd75905d10
permissions -rw-r--r--
#OTHER by cg bz2 for windows
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
2973
8b088e07f602 class: BinaryTreeNode
Stefan Vogel <sv@exept.de>
parents: 2784
diff changeset
   222
    <resource: #obsolete>
2778
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   223
    "insert a node, comparing nodes using a default sort rule"
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   224
2784
c81c8066f444 changed: #add:
Claus Gittinger <cg@exept.de>
parents: 2781
diff changeset
   225
    self obsoleteMethodWarning.
c81c8066f444 changed: #add:
Claus Gittinger <cg@exept.de>
parents: 2781
diff changeset
   226
    ^ self insertNode:aBinaryTreeNode
2778
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   227
2784
c81c8066f444 changed: #add:
Claus Gittinger <cg@exept.de>
parents: 2781
diff changeset
   228
    "Created: / 10-05-1996 / 15:09:44 / cg"
2778
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   229
!
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   230
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   231
insert:newBinaryTreeNode sortBlock:sortBlock
2973
8b088e07f602 class: BinaryTreeNode
Stefan Vogel <sv@exept.de>
parents: 2784
diff changeset
   232
    <resource: #obsolete>
2778
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
2784
c81c8066f444 changed: #add:
Claus Gittinger <cg@exept.de>
parents: 2781
diff changeset
   235
    self obsoleteMethodWarning.
c81c8066f444 changed: #add:
Claus Gittinger <cg@exept.de>
parents: 2781
diff changeset
   236
    self insertNode:newBinaryTreeNode sortBlock:sortBlock
c81c8066f444 changed: #add:
Claus Gittinger <cg@exept.de>
parents: 2781
diff changeset
   237
c81c8066f444 changed: #add:
Claus Gittinger <cg@exept.de>
parents: 2781
diff changeset
   238
    "Modified: / 05-08-2012 / 12:35:21 / cg"
c81c8066f444 changed: #add:
Claus Gittinger <cg@exept.de>
parents: 2781
diff changeset
   239
!
c81c8066f444 changed: #add:
Claus Gittinger <cg@exept.de>
parents: 2781
diff changeset
   240
c81c8066f444 changed: #add:
Claus Gittinger <cg@exept.de>
parents: 2781
diff changeset
   241
insertNode:aBinaryTreeNode
c81c8066f444 changed: #add:
Claus Gittinger <cg@exept.de>
parents: 2781
diff changeset
   242
    "insert a node, comparing nodes using a default sort rule"
c81c8066f444 changed: #add:
Claus Gittinger <cg@exept.de>
parents: 2781
diff changeset
   243
c81c8066f444 changed: #add:
Claus Gittinger <cg@exept.de>
parents: 2781
diff changeset
   244
    ^ self
c81c8066f444 changed: #add:
Claus Gittinger <cg@exept.de>
parents: 2781
diff changeset
   245
        insertNode:aBinaryTreeNode
c81c8066f444 changed: #add:
Claus Gittinger <cg@exept.de>
parents: 2781
diff changeset
   246
        sortBlock:[:a :b | a < b]
c81c8066f444 changed: #add:
Claus Gittinger <cg@exept.de>
parents: 2781
diff changeset
   247
c81c8066f444 changed: #add:
Claus Gittinger <cg@exept.de>
parents: 2781
diff changeset
   248
    "Created: / 05-08-2012 / 12:33:00 / cg"
c81c8066f444 changed: #add:
Claus Gittinger <cg@exept.de>
parents: 2781
diff changeset
   249
!
c81c8066f444 changed: #add:
Claus Gittinger <cg@exept.de>
parents: 2781
diff changeset
   250
c81c8066f444 changed: #add:
Claus Gittinger <cg@exept.de>
parents: 2781
diff changeset
   251
insertNode:newBinaryTreeNode sortBlock:sortBlock
c81c8066f444 changed: #add:
Claus Gittinger <cg@exept.de>
parents: 2781
diff changeset
   252
    "insert a node, comparing nodes using sortBlock"
c81c8066f444 changed: #add:
Claus Gittinger <cg@exept.de>
parents: 2781
diff changeset
   253
2778
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   254
    |node newValue left right|
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   255
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   256
    "/ 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
   257
    "/ AND it does not suffer stack exhaustion....
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   258
    "/ (we MUST have LCO in smalltalk for this to be automatically faster
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 := self.
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   261
    newValue := newBinaryTreeNode data.
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   262
    [true] whileTrue:[
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   263
        (sortBlock value:newValue value:node data) ifTrue:[
2973
8b088e07f602 class: BinaryTreeNode
Stefan Vogel <sv@exept.de>
parents: 2784
diff changeset
   264
            "newValue is less the node data"
2778
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   265
            left := node leftSubtree.
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   266
            left isNil ifTrue:[
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   267
                node leftSubtree:newBinaryTreeNode.
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   268
                ^ self
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   269
            ].
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   270
            node := left
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
            "newValue is larger or equal than node data"
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   273
            right := node rightSubtree.
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   274
            right isNil ifTrue:[
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   275
                node rightSubtree:newBinaryTreeNode.
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   276
                ^ self
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   277
            ].
2973
8b088e07f602 class: BinaryTreeNode
Stefan Vogel <sv@exept.de>
parents: 2784
diff changeset
   278
            "if right data is less than node, we would be jumping back..."
2778
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   279
            node := right
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   280
        ]
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   281
    ].
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   282
    "not reached"
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   283
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   284
"/    (sortBlock value:newBinaryTreeNode data value:data) ifTrue:[
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   285
"/        leftSubtree isNil ifTrue:[
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   286
"/            leftSubtree := newBinaryTreeNode.
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   287
"/        ] ifFalse:[
2973
8b088e07f602 class: BinaryTreeNode
Stefan Vogel <sv@exept.de>
parents: 2784
diff changeset
   288
"/            leftSubtree insertNode:newBinaryTreeNode sortBlock:sortBlock
2778
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   289
"/        ]
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   290
"/    ] ifFalse:[
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   291
"/        rightSubtree isNil ifTrue:[
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   292
"/            rightSubtree := newBinaryTreeNode.
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   293
"/        ] ifFalse:[
2973
8b088e07f602 class: BinaryTreeNode
Stefan Vogel <sv@exept.de>
parents: 2784
diff changeset
   294
"/            rightSubtree insertNode:newBinaryTreeNode sortBlock:sortBlock
2778
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   295
"/        ]
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   296
"/    ]
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
     BinaryTree withAll:#(16 3 1 0 4 7 9)             
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   300
    "
2784
c81c8066f444 changed: #add:
Claus Gittinger <cg@exept.de>
parents: 2781
diff changeset
   301
c81c8066f444 changed: #add:
Claus Gittinger <cg@exept.de>
parents: 2781
diff changeset
   302
    "Created: / 05-08-2012 / 12:33:39 / cg"
2778
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   303
! !
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   304
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   305
!BinaryTreeNode methodsFor:'printing'!
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   306
2784
c81c8066f444 changed: #add:
Claus Gittinger <cg@exept.de>
parents: 2781
diff changeset
   307
printDataOn:aStream
c81c8066f444 changed: #add:
Claus Gittinger <cg@exept.de>
parents: 2781
diff changeset
   308
    data printOn: aStream.
c81c8066f444 changed: #add:
Claus Gittinger <cg@exept.de>
parents: 2781
diff changeset
   309
c81c8066f444 changed: #add:
Claus Gittinger <cg@exept.de>
parents: 2781
diff changeset
   310
    "Created: / 05-08-2012 / 14:00:10 / cg"
c81c8066f444 changed: #add:
Claus Gittinger <cg@exept.de>
parents: 2781
diff changeset
   311
!
c81c8066f444 changed: #add:
Claus Gittinger <cg@exept.de>
parents: 2781
diff changeset
   312
2778
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   313
printOn: aStream
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   314
    "Append the ascii representation to aStream"
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   315
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   316
    data isNil
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   317
        ifTrue: [aStream nextPutAll: '--']
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   318
        ifFalse: [
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   319
            aStream nextPut: $(.
2973
8b088e07f602 class: BinaryTreeNode
Stefan Vogel <sv@exept.de>
parents: 2784
diff changeset
   320
            self printDataOn: aStream. aStream space.
8b088e07f602 class: BinaryTreeNode
Stefan Vogel <sv@exept.de>
parents: 2784
diff changeset
   321
            leftSubtree printOn: aStream. aStream space.
2778
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   322
            rightSubtree printOn: aStream.
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   323
            aStream nextPut: $)]
2784
c81c8066f444 changed: #add:
Claus Gittinger <cg@exept.de>
parents: 2781
diff changeset
   324
c81c8066f444 changed: #add:
Claus Gittinger <cg@exept.de>
parents: 2781
diff changeset
   325
    "Modified: / 06-08-2012 / 08:05:04 / cg"
2778
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   326
!
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   327
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   328
printOn:aStream indent:i
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   329
    "Append the graphical ascii representation to aStream"
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   330
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   331
    data isNil
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   332
        ifTrue: [aStream spaces:i. aStream nextPutAll: '--']
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   333
        ifFalse: [
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   334
            aStream spaces:i. aStream nextPut: $(.
2784
c81c8066f444 changed: #add:
Claus Gittinger <cg@exept.de>
parents: 2781
diff changeset
   335
            self printDataOn: aStream. 
2778
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   336
            aStream cr.
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   337
            leftSubtree isNil 
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   338
                ifTrue:[ aStream spaces:i+2. '--' printOn: aStream]
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   339
                ifFalse:[ leftSubtree printOn: aStream indent:i+2 ]. 
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   340
            aStream cr.
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   341
            rightSubtree isNil 
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   342
                ifTrue:[ aStream spaces:i+2. '--' printOn: aStream]
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   343
                ifFalse:[ rightSubtree printOn: aStream indent:i+2 ]. 
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   344
            aStream nextPut: $)
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   345
        ]
2784
c81c8066f444 changed: #add:
Claus Gittinger <cg@exept.de>
parents: 2781
diff changeset
   346
c81c8066f444 changed: #add:
Claus Gittinger <cg@exept.de>
parents: 2781
diff changeset
   347
    "Modified: / 06-08-2012 / 08:05:15 / cg"
2778
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   348
! !
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   349
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   350
!BinaryTreeNode methodsFor:'private helpers'!
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   351
2973
8b088e07f602 class: BinaryTreeNode
Stefan Vogel <sv@exept.de>
parents: 2784
diff changeset
   352
removeLeftMostNode
8b088e07f602 class: BinaryTreeNode
Stefan Vogel <sv@exept.de>
parents: 2784
diff changeset
   353
    |left ll parent|
8b088e07f602 class: BinaryTreeNode
Stefan Vogel <sv@exept.de>
parents: 2784
diff changeset
   354
8b088e07f602 class: BinaryTreeNode
Stefan Vogel <sv@exept.de>
parents: 2784
diff changeset
   355
    leftSubtree isNil ifTrue:[
8b088e07f602 class: BinaryTreeNode
Stefan Vogel <sv@exept.de>
parents: 2784
diff changeset
   356
        self error:'should not happen'
8b088e07f602 class: BinaryTreeNode
Stefan Vogel <sv@exept.de>
parents: 2784
diff changeset
   357
    ].
8b088e07f602 class: BinaryTreeNode
Stefan Vogel <sv@exept.de>
parents: 2784
diff changeset
   358
8b088e07f602 class: BinaryTreeNode
Stefan Vogel <sv@exept.de>
parents: 2784
diff changeset
   359
    parent := self.
8b088e07f602 class: BinaryTreeNode
Stefan Vogel <sv@exept.de>
parents: 2784
diff changeset
   360
    left := leftSubtree.
8b088e07f602 class: BinaryTreeNode
Stefan Vogel <sv@exept.de>
parents: 2784
diff changeset
   361
    [ (ll := left leftSubtree) notNil ] whileTrue:[
8b088e07f602 class: BinaryTreeNode
Stefan Vogel <sv@exept.de>
parents: 2784
diff changeset
   362
        parent := left.
8b088e07f602 class: BinaryTreeNode
Stefan Vogel <sv@exept.de>
parents: 2784
diff changeset
   363
        left := ll.
8b088e07f602 class: BinaryTreeNode
Stefan Vogel <sv@exept.de>
parents: 2784
diff changeset
   364
    ].
8b088e07f602 class: BinaryTreeNode
Stefan Vogel <sv@exept.de>
parents: 2784
diff changeset
   365
    parent leftSubtree:(left rightSubtree).
8b088e07f602 class: BinaryTreeNode
Stefan Vogel <sv@exept.de>
parents: 2784
diff changeset
   366
    left rightSubtree:nil.
8b088e07f602 class: BinaryTreeNode
Stefan Vogel <sv@exept.de>
parents: 2784
diff changeset
   367
    ^ left.
8b088e07f602 class: BinaryTreeNode
Stefan Vogel <sv@exept.de>
parents: 2784
diff changeset
   368
!
8b088e07f602 class: BinaryTreeNode
Stefan Vogel <sv@exept.de>
parents: 2784
diff changeset
   369
2778
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   370
removeLeftRightMostNode
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   371
    |rightMost|
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   372
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   373
    leftSubtree rightSubtree isNil ifTrue:[
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   374
        rightMost := leftSubtree.
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   375
        leftSubtree := leftSubtree leftSubtree.
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   376
        ^ rightMost.
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   377
    ].
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   378
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   379
    ^ leftSubtree removeRightMostNode
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   380
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   381
    "
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   382
     |tree|
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   383
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   384
     tree := BinaryTreeNode data:4.
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   385
     #(2 6 1 3 5 7)
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   386
     do:[:word |
2973
8b088e07f602 class: BinaryTreeNode
Stefan Vogel <sv@exept.de>
parents: 2784
diff changeset
   387
         tree insertNode:(BinaryTreeNode data:word).
2778
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   388
     ].
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   389
     tree printOn:Transcript indent:0. Transcript cr.
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   390
     '---------------------------' printOn:Transcript. Transcript cr.
2973
8b088e07f602 class: BinaryTreeNode
Stefan Vogel <sv@exept.de>
parents: 2784
diff changeset
   391
     Transcript showCR:tree removeLeftRightMostNode.
8b088e07f602 class: BinaryTreeNode
Stefan Vogel <sv@exept.de>
parents: 2784
diff changeset
   392
     tree printOn:Transcript indent:0. Transcript cr.
8b088e07f602 class: BinaryTreeNode
Stefan Vogel <sv@exept.de>
parents: 2784
diff changeset
   393
    "
8b088e07f602 class: BinaryTreeNode
Stefan Vogel <sv@exept.de>
parents: 2784
diff changeset
   394
!
8b088e07f602 class: BinaryTreeNode
Stefan Vogel <sv@exept.de>
parents: 2784
diff changeset
   395
8b088e07f602 class: BinaryTreeNode
Stefan Vogel <sv@exept.de>
parents: 2784
diff changeset
   396
removeRightLeftMostNode
8b088e07f602 class: BinaryTreeNode
Stefan Vogel <sv@exept.de>
parents: 2784
diff changeset
   397
    |leftMost|
8b088e07f602 class: BinaryTreeNode
Stefan Vogel <sv@exept.de>
parents: 2784
diff changeset
   398
8b088e07f602 class: BinaryTreeNode
Stefan Vogel <sv@exept.de>
parents: 2784
diff changeset
   399
    rightSubtree leftSubtree isNil ifTrue:[
8b088e07f602 class: BinaryTreeNode
Stefan Vogel <sv@exept.de>
parents: 2784
diff changeset
   400
        leftMost := rightSubtree.
8b088e07f602 class: BinaryTreeNode
Stefan Vogel <sv@exept.de>
parents: 2784
diff changeset
   401
        rightSubtree := rightSubtree rightSubtree.
8b088e07f602 class: BinaryTreeNode
Stefan Vogel <sv@exept.de>
parents: 2784
diff changeset
   402
        ^ leftMost.
8b088e07f602 class: BinaryTreeNode
Stefan Vogel <sv@exept.de>
parents: 2784
diff changeset
   403
    ].
8b088e07f602 class: BinaryTreeNode
Stefan Vogel <sv@exept.de>
parents: 2784
diff changeset
   404
8b088e07f602 class: BinaryTreeNode
Stefan Vogel <sv@exept.de>
parents: 2784
diff changeset
   405
    ^ rightSubtree removeLeftMostNode
8b088e07f602 class: BinaryTreeNode
Stefan Vogel <sv@exept.de>
parents: 2784
diff changeset
   406
8b088e07f602 class: BinaryTreeNode
Stefan Vogel <sv@exept.de>
parents: 2784
diff changeset
   407
    "
8b088e07f602 class: BinaryTreeNode
Stefan Vogel <sv@exept.de>
parents: 2784
diff changeset
   408
     |tree|
8b088e07f602 class: BinaryTreeNode
Stefan Vogel <sv@exept.de>
parents: 2784
diff changeset
   409
8b088e07f602 class: BinaryTreeNode
Stefan Vogel <sv@exept.de>
parents: 2784
diff changeset
   410
     tree := BinaryTreeNode data:4.
8b088e07f602 class: BinaryTreeNode
Stefan Vogel <sv@exept.de>
parents: 2784
diff changeset
   411
     #(2 6 1 3 5 7)
8b088e07f602 class: BinaryTreeNode
Stefan Vogel <sv@exept.de>
parents: 2784
diff changeset
   412
     do:[:word |
8b088e07f602 class: BinaryTreeNode
Stefan Vogel <sv@exept.de>
parents: 2784
diff changeset
   413
         tree insertNode:(BinaryTreeNode data:word).
8b088e07f602 class: BinaryTreeNode
Stefan Vogel <sv@exept.de>
parents: 2784
diff changeset
   414
     ].
8b088e07f602 class: BinaryTreeNode
Stefan Vogel <sv@exept.de>
parents: 2784
diff changeset
   415
     tree printOn:Transcript indent:0. Transcript cr.
8b088e07f602 class: BinaryTreeNode
Stefan Vogel <sv@exept.de>
parents: 2784
diff changeset
   416
     '---------------------------' printOn:Transcript. Transcript cr.
8b088e07f602 class: BinaryTreeNode
Stefan Vogel <sv@exept.de>
parents: 2784
diff changeset
   417
     Transcript showCR:tree removeRightLeftMostNode.
2778
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   418
     tree printOn:Transcript indent:0. Transcript cr.
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   419
    "
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   420
!
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   421
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   422
removeRightMostNode
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   423
    |right rr parent|
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   424
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   425
    rightSubtree isNil ifTrue:[
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   426
        self error:'should not happen'
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
    parent := self.
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   430
    right := rightSubtree.
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   431
    [ (rr := right rightSubtree) notNil ] whileTrue:[
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   432
        parent := right.
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   433
        right := rr.
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   434
    ].
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   435
    parent rightSubtree:(right leftSubtree).
2973
8b088e07f602 class: BinaryTreeNode
Stefan Vogel <sv@exept.de>
parents: 2784
diff changeset
   436
    right leftSubtree:nil.
2778
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   437
    ^ right.
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   438
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   439
    "
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   440
     |tree|
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   441
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   442
     tree := BinaryTreeNode data:4.
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   443
     #(2 6 1 3 5 7)
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   444
     do:[:word |
2973
8b088e07f602 class: BinaryTreeNode
Stefan Vogel <sv@exept.de>
parents: 2784
diff changeset
   445
         tree insertNode:(BinaryTreeNode data:word).
2778
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   446
     ].
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   447
     Transcript showCR:tree.
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   448
     Transcript showCR:(tree removeLeftRightMostNode). 
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   449
     Transcript showCR:tree.
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   450
    "
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   451
!
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   452
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   453
removeValue:oldValue using:compareOp sortBlock:sortBlock
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   454
    "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
   455
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   456
    |thisIsMyNode newTop newLeft newRight|
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   457
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   458
    "/ speed hack - avoids message sends (and also better inline caching)
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   459
    compareOp == #== ifTrue:[
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   460
        thisIsMyNode := (data == oldValue).
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   461
    ] ifFalse:[
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   462
        compareOp == #= ifTrue:[
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   463
            thisIsMyNode := (data = oldValue).
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   464
        ] ifFalse:[
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   465
            thisIsMyNode := data perform:compareOp with:oldValue.
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   466
        ].
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   467
    ].
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   468
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   469
    thisIsMyNode ifTrue:[
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   470
        leftSubtree isNil ifTrue:[
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   471
            ^ rightSubtree
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   472
        ].
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   473
        rightSubtree isNil ifTrue:[
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   474
            ^ leftSubtree
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   475
        ].
2973
8b088e07f602 class: BinaryTreeNode
Stefan Vogel <sv@exept.de>
parents: 2784
diff changeset
   476
        newTop := self removeRightLeftMostNode.
8b088e07f602 class: BinaryTreeNode
Stefan Vogel <sv@exept.de>
parents: 2784
diff changeset
   477
"/        self assert:(rightSubtree isNil or:[(sortBlock value:rightSubtree data value:newTop data) not]).
8b088e07f602 class: BinaryTreeNode
Stefan Vogel <sv@exept.de>
parents: 2784
diff changeset
   478
"/        self assert:(leftSubtree isNil or:[sortBlock value:leftSubtree data value:newTop data]).
8b088e07f602 class: BinaryTreeNode
Stefan Vogel <sv@exept.de>
parents: 2784
diff changeset
   479
        newTop 
8b088e07f602 class: BinaryTreeNode
Stefan Vogel <sv@exept.de>
parents: 2784
diff changeset
   480
            leftSubtree:leftSubtree; 
8b088e07f602 class: BinaryTreeNode
Stefan Vogel <sv@exept.de>
parents: 2784
diff changeset
   481
            rightSubtree:rightSubtree.
2778
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   482
        ^ newTop.
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   483
    ].
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   484
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   485
    (sortBlock value:oldValue value:data) ifTrue:[
2973
8b088e07f602 class: BinaryTreeNode
Stefan Vogel <sv@exept.de>
parents: 2784
diff changeset
   486
        "oldValue is less the node data
8b088e07f602 class: BinaryTreeNode
Stefan Vogel <sv@exept.de>
parents: 2784
diff changeset
   487
         and should be in the left part"
2778
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   488
        leftSubtree isNil ifTrue:[
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   489
            ^ nil
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   490
        ].
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   491
        newLeft := leftSubtree removeValue:oldValue using:compareOp sortBlock:sortBlock.
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   492
        newLeft isNil ifTrue:[
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   493
            (leftSubtree data perform:compareOp with:oldValue) ifFalse:[
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   494
                ^ nil
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   495
            ].
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   496
        ].
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   497
        leftSubtree := newLeft.
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   498
    ] ifFalse:[
2973
8b088e07f602 class: BinaryTreeNode
Stefan Vogel <sv@exept.de>
parents: 2784
diff changeset
   499
        "oldValue is larger or equal (equal if doing identity-compare above)
8b088e07f602 class: BinaryTreeNode
Stefan Vogel <sv@exept.de>
parents: 2784
diff changeset
   500
         than the node data and should be in the right part"
2778
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   501
        rightSubtree isNil ifTrue:[
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   502
            ^ nil
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   503
        ].
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   504
        newRight := rightSubtree removeValue:oldValue using:compareOp sortBlock:sortBlock.
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   505
        newRight isNil ifTrue:[
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   506
            (rightSubtree data perform:compareOp with:oldValue) ifFalse:[
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   507
                ^ nil
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   508
            ].
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   509
        ].
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   510
        rightSubtree := newRight.
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   511
    ].
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   512
    ^ self. 
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   513
! !
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   514
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   515
!BinaryTreeNode methodsFor:'queries'!
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   516
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   517
depth
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   518
    "Returns the depth of the binary tree (0 for leafs)"
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   519
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   520
    ^ self level - 1.
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   521
!
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   522
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   523
getTreeWithAnInteger: anInteger
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   524
    "Private - Returns the BinaryTree with data anInteger.  
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   525
     If anInteger not in the tree it returns nil."
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   526
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   527
    self inOrderDo: [:each| each data = anInteger ifTrue:[^each]].
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   528
    ^nil.
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   529
!
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   530
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   531
inOrderSuccessor
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   532
    "Returns the in-order successor the of receiver.
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   533
     (that is the leftMost node on the right side)
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   534
     If receiver is empty then returns the receiver."
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   535
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   536
    rightSubtree isNil ifTrue:[^ self].
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   537
    ^ rightSubtree leftMostNode
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   538
!
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   539
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   540
includesIdenticalValue:aValue sortBlock:sortBlock
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   541
    "return true, if aValue is contained as some node's data"
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   542
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   543
    data == aValue ifTrue:[ ^ true ].
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   544
    (sortBlock value:aValue value:data) ifTrue:[
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   545
        leftSubtree isNil ifTrue:[
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   546
            ^ false
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   547
        ].
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   548
        ^ leftSubtree includesIdenticalValue:aValue sortBlock:sortBlock.
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   549
    ].
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   550
    rightSubtree isNil ifTrue:[
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   551
        ^ false
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   552
    ].
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   553
    ^ rightSubtree includesIdenticalValue:aValue sortBlock:sortBlock.
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   554
!
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   555
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   556
includesValue:aValue sortBlock:sortBlock
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   557
    "return true, if some node's data is equal to aValue"
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   558
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   559
    data = aValue ifTrue:[ ^ true ].
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   560
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   561
    (sortBlock value:aValue value:data) ifTrue:[
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   562
        leftSubtree isNil ifTrue:[
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   563
            ^ false
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   564
        ].
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   565
        ^ leftSubtree includesValue:aValue sortBlock:sortBlock.
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   566
    ].
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   567
    rightSubtree isNil ifTrue:[
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   568
        ^ false
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   569
    ].
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   570
    ^ rightSubtree includesValue:aValue sortBlock:sortBlock.
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   571
!
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   572
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   573
isEmpty
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   574
    "returns true if the binary tree is empty and false otherwise"
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   575
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   576
    ^ data isNil
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   577
!
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   578
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   579
isLeaf
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   580
    "Returns true if self is a leaf"
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   581
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   582
    ^ ((leftSubtree isNil) and: [rightSubtree isNil])
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   583
!
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   584
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   585
leftMostNode
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   586
    "Returns the leftMost (smallest-valued) node"
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   587
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   588
    leftSubtree isNil ifTrue:[^ self].
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   589
    ^ leftSubtree leftMostNode
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   590
!
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   591
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   592
level
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   593
    "Returns the level of the binary tree (1 for leafs)"
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   594
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   595
    |l|
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   596
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   597
    l := 0.
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   598
    leftSubtree notNil ifTrue:[
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   599
        l := leftSubtree level
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   600
    ].
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   601
    rightSubtree notNil ifTrue:[
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   602
        l := l max:(rightSubtree level)
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   603
    ].
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   604
    ^ l + 1
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   605
!
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   606
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   607
rightMostNode
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   608
    "Returns the rightMost (largest-valued) node"
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   609
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   610
    rightSubtree isNil ifTrue:[^ self].
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   611
    ^ rightSubtree rightMostNode
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   612
!
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   613
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   614
size
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   615
    "Returns the size of the binary tree"
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   616
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   617
    ^ 1
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   618
    + (leftSubtree isNil ifTrue: [0] ifFalse:[leftSubtree size])
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   619
    + (rightSubtree isNil ifTrue: [0] ifFalse:[rightSubtree size])
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   620
! !
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   621
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   622
!BinaryTreeNode class methodsFor:'documentation'!
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   623
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   624
version
2973
8b088e07f602 class: BinaryTreeNode
Stefan Vogel <sv@exept.de>
parents: 2784
diff changeset
   625
    ^ '$Header: /cvs/stx/stx/libbasic2/BinaryTreeNode.st,v 1.9 2013-04-08 14:36:27 stefan Exp $'
2778
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   626
!
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   627
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   628
version_CVS
2973
8b088e07f602 class: BinaryTreeNode
Stefan Vogel <sv@exept.de>
parents: 2784
diff changeset
   629
    ^ '$Header: /cvs/stx/stx/libbasic2/BinaryTreeNode.st,v 1.9 2013-04-08 14:36:27 stefan Exp $'
2778
7f379c407160 public again
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   630
! !
2973
8b088e07f602 class: BinaryTreeNode
Stefan Vogel <sv@exept.de>
parents: 2784
diff changeset
   631