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