BinaryTree.st
author Claus Gittinger <cg@exept.de>
Mon, 04 Jun 2007 21:44:03 +0200
changeset 1885 4d424e94093c
parent 1628 0c7d951c6f99
child 1921 8ed4ef884253
permissions -rw-r--r--
oops
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1379
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     1
"{ Package: 'stx:libbasic2' }"
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     2
1380
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
     3
Collection subclass:#BinaryTree
1379
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     4
	instanceVariableNames:'treeRoot sortBlock'
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     5
	classVariableNames:''
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     6
	poolDictionaries:''
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     7
	category:'Collections-Ordered'
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     8
!
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     9
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    10
Object subclass:#BinaryTreeNode
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    11
	instanceVariableNames:'data leftSubtree rightSubtree'
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    12
	classVariableNames:''
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    13
	poolDictionaries:''
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    14
	privateIn:BinaryTree
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    15
!
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    16
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    17
!BinaryTree class methodsFor:'documentation'!
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    18
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    19
documentation
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    20
"
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    21
    Loosely based on the Public Domain BinaryTreeNode class from Steve Chepurny.
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    22
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    23
    Changes:
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    24
        Changed to be Collection-protocol compatible.
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    25
        Slight speedup in insert-code.
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    26
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    27
    [author:]
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    28
        Steve Chepurny (original BinaryTreeNode implementation)
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    29
        Claus Gittinger (cg@alan)
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    30
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    31
    [instance variables:]
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    32
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    33
    [class variables:]
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    34
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    35
    [see also:]
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    36
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    37
"
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    38
!
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    39
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    40
examples
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    41
"
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    42
                                                                [exBegin]
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    43
    |coll|
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    44
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    45
    coll := BinaryTree new.
1628
0c7d951c6f99 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1625
diff changeset
    46
    (1 to:10) do:[:i | coll add:i].
1379
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    47
    coll addAll:(20 to:30).
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    48
    coll    
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    49
                                                                [exEnd]
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    50
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    51
  timing:  
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    52
                                                                [exBegin]
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    53
    |N randomNumbers coll1 coll2 t1 t2|
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    54
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    55
    N := 1000000.
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    56
    randomNumbers := (1 to:N) collect:[:i | Random nextInteger].
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    57
1380
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
    58
    ObjectMemory garbageCollect.
1379
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    59
    t1 := Time millisecondsToRun:[
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    60
        coll1 := BinaryTree new.
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    61
        coll1 addAll:randomNumbers
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    62
    ].
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    63
1380
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
    64
    coll1 := nil.
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
    65
    ObjectMemory garbageCollect.
1379
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    66
    t2 := Time millisecondsToRun:[
1380
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
    67
        coll2 := SortedCollection new.
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
    68
        coll2 addAll:randomNumbers
1379
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    69
    ].
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    70
    Transcript show:'Time to insert '; show:N; show:' into BinaryTree: '; show:t1; showCR:'ms'.
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    71
    Transcript show:'Time to insert '; show:N; show:' into SortedCollection: '; show:t2; showCR:'ms'.
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    72
                                                                [exEnd]
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    73
1380
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
    74
  timing 2:  
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
    75
                                                                [exBegin]
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
    76
    |allSelectors coll1 coll2 t0 t1 t2|
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
    77
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
    78
    allSelectors := OrderedCollection new.
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
    79
    Smalltalk allClassesDo:[:cls |
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
    80
        cls instAndClassSelectorsAndMethodsDo:[:sel :mthd |
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
    81
            allSelectors add:sel.
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
    82
        ].
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
    83
    ].
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
    84
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
    85
    t1 := Time millisecondsToRun:[
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
    86
        coll1 := SortedCollection new.
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
    87
        allSelectors do:[:sel |
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
    88
            coll1 add:sel
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
    89
        ].
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
    90
    ].
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
    91
    Transcript show:'Time to insert '; show:coll1 size; show:' selectors into SortedCollection: '; show:t1; showCR:'ms'.
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
    92
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
    93
    t2 := Time millisecondsToRun:[
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
    94
        coll2 := BinaryTree new.
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
    95
        allSelectors do:[:sel |
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
    96
            coll2 add:sel
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
    97
        ].
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
    98
    ].
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
    99
    Transcript show:'Time to insert '; show:coll2 size; show:' selectors into BinaryTree: '; show:t2; showCR:'ms'.
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   100
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   101
    t1 := Time millisecondsToRun:[
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   102
        allSelectors do:[:sel |
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   103
            coll1 remove:sel
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   104
        ].
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   105
    ].
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   106
    self assert:(coll1 isEmpty).
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   107
    Transcript show:'Time to remove selectors from SortedCollection: '; show:t1; showCR:'ms'.
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   108
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   109
    t2 := Time millisecondsToRun:[
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   110
        allSelectors do:[:sel |
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   111
            coll2 remove:sel
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   112
        ].
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   113
    ].
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   114
    self assert:(coll2 isEmpty).
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   115
    Transcript show:'Time to remove selectors from BinaryTree: '; show:t2; showCR:'ms'.
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   116
                                                                [exEnd]
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   117
1379
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   118
"
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   119
! !
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   120
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   121
!BinaryTree class methodsFor:'instance creation'!
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   122
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   123
new
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   124
    ^ self basicNew initialize
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   125
!
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   126
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   127
new:n
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   128
    ^ self new
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   129
! !
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   130
1625
3ec198518bdc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1475
diff changeset
   131
!BinaryTree methodsFor:'accessing'!
3ec198518bdc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1475
diff changeset
   132
3ec198518bdc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1475
diff changeset
   133
sortBlock:something
3ec198518bdc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1475
diff changeset
   134
    sortBlock := something.
3ec198518bdc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1475
diff changeset
   135
! !
3ec198518bdc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1475
diff changeset
   136
1379
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   137
!BinaryTree methodsFor:'adding & removing'!
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   138
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   139
add:anObject
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   140
    |newNode|
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   141
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   142
    newNode := BinaryTreeNode data:anObject.
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   143
    treeRoot isNil ifTrue:[
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   144
        treeRoot := newNode.
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   145
    ] ifFalse:[
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   146
        treeRoot insert:newNode sortBlock:sortBlock
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   147
    ].
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   148
    ^ anObject "sigh - collection protocol"
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   149
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   150
    "
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   151
     BinaryTree new add:1; add:2; yourself
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   152
     BinaryTree with:1 with:2 with:3
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   153
    "
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   154
!
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   155
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   156
do:aBlock
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   157
    treeRoot notNil ifTrue:[
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   158
        treeRoot inOrderDo:[:eachNode | aBlock value:(eachNode data)].
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   159
    ].
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   160
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   161
    "
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   162
     BinaryTree new add:1; add:2; yourself
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   163
    "
1380
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   164
!
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   165
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   166
includesIdentical:anElement
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   167
    treeRoot isNil ifTrue:[
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   168
        ^ false.
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   169
    ].
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   170
    ^ treeRoot includesIdenticalValue:anElement sortBlock:sortBlock.
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   171
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   172
    "
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   173
     BinaryTree new 
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   174
        addAll:#(4 2 1 3 6 5 7); 
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   175
        includesIdentical:4
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   176
    "
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   177
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   178
    "
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   179
     BinaryTree new 
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   180
        addAll:#(4 2 1 3 6 5 7); 
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   181
        includesIdentical:8
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   182
    "
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   183
!
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   184
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   185
remove:oldObject ifAbsent:exceptionValue
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   186
    |newRoot|
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   187
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   188
    treeRoot isNil ifTrue:[
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   189
        ^ exceptionValue value.
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   190
    ].
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   191
    newRoot := treeRoot removeValue:oldObject sortBlock:sortBlock.
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   192
    newRoot isNil ifTrue:[
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   193
        treeRoot data = oldObject ifFalse:[
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   194
            ^ exceptionValue value.
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   195
        ].
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   196
    ].
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   197
    treeRoot := newRoot    
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   198
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   199
    "
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   200
     BinaryTree new 
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   201
        addAll:#(4 2 1 3 6 5 7); 
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   202
        removeIdentical:4;
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   203
        yourself   
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   204
    "
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   205
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   206
    "
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   207
     BinaryTree new 
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   208
        addAll:#(4 2 1 3 6 5 7); 
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   209
        removeIdentical:7;
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   210
        yourself      
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   211
    "
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   212
!
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   213
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   214
removeIdentical:oldObject ifAbsent:exceptionValue
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   215
    |newRoot|
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   216
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   217
    treeRoot isNil ifTrue:[
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   218
        ^ exceptionValue value.
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   219
    ].
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   220
    newRoot := treeRoot removeIdenticalValue:oldObject sortBlock:sortBlock.
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   221
    newRoot isNil ifTrue:[
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   222
        ^ exceptionValue value.
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   223
    ].
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   224
    treeRoot := newRoot    
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   225
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   226
    "
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   227
     BinaryTree new 
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   228
        addAll:#(4 2 1 3 6 5 7); 
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   229
        removeIdentical:4;
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   230
        yourself   
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   231
    "
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   232
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   233
    "
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   234
     BinaryTree new 
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   235
        addAll:#(4 2 1 3 6 5 7); 
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   236
        removeIdentical:7;
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   237
        yourself      
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   238
    "
1379
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   239
! !
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   240
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   241
!BinaryTree methodsFor:'initialization'!
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   242
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   243
initialize
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   244
    sortBlock := [:a :b | a < b]
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   245
! !
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   246
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   247
!BinaryTree methodsFor:'queries'!
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   248
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   249
size
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   250
    ^ treeRoot size
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   251
! !
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   252
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   253
!BinaryTree::BinaryTreeNode class methodsFor:'documentation'!
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   254
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   255
copyright
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   256
"
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   257
    Public domain (I guess, as it was published in c.l.s)
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   258
    no limitation on use.
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   259
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   260
    This class is provided as-is, without any warranty. 
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   261
    It is not part of or covered by the ST/X copyright.
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   262
"
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   263
!
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   264
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   265
documentation
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   266
"
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   267
    goody from comp.lang.smalltalk;
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   268
    original header:
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   269
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   270
	Here's a complete implementation of a binary tree class:
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   271
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   272
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   273
    claus:
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   274
	I would have called this a BinaryTreeNode ....
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   275
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   276
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   277
    [organization:]
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   278
	The National Capital FreeNet, Ottawa, Ontario, Canada
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   279
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   280
    [author:]
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   281
	al938@FreeNet.Carleton.CA (Steve Chepurny)
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   282
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   283
    [see also:]
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   284
	LinkedList Chain
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   285
	Link ValueLink ChainLink
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   286
"
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   287
!
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   288
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   289
examples
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   290
"
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   291
  manual building of a tree:
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   292
                                                                        [exBegin]
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   293
    |tree|
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   294
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   295
    tree := BinaryTreeNode data:2.
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   296
    tree leftSubtree:(BinaryTreeNode new data:1).
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   297
    tree rightSubtree:(BinaryTreeNode new data:3).
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   298
    tree printOn:Transcript.
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   299
                                                                        [exEnd]
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   300
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   301
  insertion:
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   302
                                                                        [exBegin]
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   303
    |tree|
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   304
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   305
    tree := BinaryTreeNode data:'hello'.
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   306
    #('the' 'quick' 'brown' 'fox' 'jumps' 'over' 'the' 'lazy' 'dogs')
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   307
    do:[:word |
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   308
        tree insert:(BinaryTreeNode data:word).
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   309
    ].
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   310
    tree inOrderDo:[:node |
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   311
        Transcript showCR:node data
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   312
    ]
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   313
                                                                        [exEnd]
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   314
"
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   315
! !
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   316
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   317
!BinaryTree::BinaryTreeNode class methodsFor:'instance creation'!
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   318
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   319
data:data
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   320
    "Returns a new binary tree node, holding data"
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   321
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   322
    ^ self basicNew initialize data:data
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   323
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   324
    "Modified: 10.5.1996 / 15:00:13 / cg"
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   325
    "Created: 10.5.1996 / 15:00:35 / cg"
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   326
!
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   327
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   328
empty
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   329
    "Returns a new binary tree with subtrees as binary tree nodes"
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   330
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   331
    ^ self new
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   332
	    leftSubtree: self new;
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   333
	    rightSubtree: self new
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   334
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   335
    "Modified: 10.5.1996 / 15:00:02 / cg"
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   336
!
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   337
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   338
new
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   339
    "Returns a new empty binary tree node"
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   340
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   341
    ^ self basicNew initialize
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   342
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   343
    "Modified: 10.5.1996 / 15:00:13 / cg"
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   344
! !
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   345
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   346
!BinaryTree::BinaryTreeNode methodsFor:'accessing'!
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   347
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   348
data
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   349
    ^data
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   350
!
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   351
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   352
data:   anObject
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   353
    data := anObject
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   354
!
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   355
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   356
leftSubtree
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   357
    ^leftSubtree
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   358
!
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   359
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   360
leftSubtree: aBinaryTree
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   361
    leftSubtree := aBinaryTree
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   362
!
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   363
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   364
rightSubtree
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   365
    ^rightSubtree
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   366
!
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   367
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   368
rightSubtree: aBinaryTree
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   369
    rightSubtree := aBinaryTree
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   370
! !
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   371
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   372
!BinaryTree::BinaryTreeNode methodsFor:'enumeration'!
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   373
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   374
do: aBlock
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   375
    "applies aBlock to each elements data in the binary tree in inorder"
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   376
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   377
    self inOrderDo:[:eachNode | aBlock value:eachNode data]
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   378
!
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   379
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   380
inOrderDo:aBlock
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   381
    "Traverses the elements of the binary tree in
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   382
        LEFT - ROOT - RIGHT order, 
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   383
     applying a block to each node"
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   384
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   385
    leftSubtree notNil ifTrue:[
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   386
        leftSubtree inOrderDo: aBlock
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   387
    ].
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   388
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   389
    aBlock value:self.
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   390
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   391
    rightSubtree notNil ifTrue:[
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   392
        rightSubtree inOrderDo: aBlock
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   393
    ].
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   394
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   395
    "Modified: 10.5.1996 / 15:10:34 / cg"
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   396
!
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   397
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   398
postOrderDo: aBlock
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   399
    "Traverses the elements of the binary tree in
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   400
        LEFT - RIGHT - ROOT order, 
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   401
     applying a block to each node"
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   402
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   403
    leftSubtree notNil ifTrue:[
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   404
        leftSubtree postOrderDo: aBlock
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   405
    ].
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   406
    rightSubtree notNil ifTrue:[
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   407
        rightSubtree postOrderDo: aBlock
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   408
    ].
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   409
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   410
    aBlock value: self.
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   411
!
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   412
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   413
preOrderDo: aBlock
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   414
    "Traverses the elements of the binary tree in
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   415
        ROOT - LEFT - RIGHT order, 
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   416
     applying a block to each node"
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   417
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   418
    aBlock value: self.
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   419
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   420
    leftSubtree notNil ifTrue:[
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   421
        leftSubtree preOrderDo: aBlock
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   422
    ].
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   423
    rightSubtree notNil ifTrue:[
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   424
        rightSubtree preOrderDo: aBlock
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   425
    ].
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   426
! !
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   427
1380
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   428
!BinaryTree::BinaryTreeNode methodsFor:'insert & delete'!
1379
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   429
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   430
insert:aBinaryTreeNode
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   431
    "insert a node, comparing nodes using a default sort rule"
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   432
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   433
    ^ self
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   434
        insert:aBinaryTreeNode
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   435
        sortBlock:[:a :b | a < b]
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   436
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   437
    "Modified: 10.5.1996 / 15:08:30 / cg"
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   438
    "Created: 10.5.1996 / 15:09:44 / cg"
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   439
!
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   440
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   441
insert:newBinaryTreeNode sortBlock:sortBlock
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   442
    "insert a node, comparing nodes using sortBlock"
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   443
1380
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   444
"/    "/ the following might be ugly - however, it it slightly faster
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   445
"/    "/ than the stuff below.
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   446
"/    "/ (we MUST have LCO in smalltalk for this to be automatically fast)
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   447
"/
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   448
"/    |node newValue left right|
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   449
"/
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   450
"/    node := self.
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   451
"/    newValue := newBinaryTreeNode data.
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   452
"/    [true] whileTrue:[
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   453
"/        (sortBlock value:newValue value:node data) ifTrue:[
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   454
"/            left := node leftSubtree.
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   455
"/            left isNil ifTrue:[
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   456
"/                node leftSubtree:newBinaryTreeNode.
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   457
"/                ^ self
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   458
"/            ].
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   459
"/            node := left
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   460
"/        ] ifFalse:[
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   461
"/            right := node rightSubtree.
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   462
"/            right isNil ifTrue:[
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   463
"/                node rightSubtree:newBinaryTreeNode.
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   464
"/                ^ self
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   465
"/            ].
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   466
"/            node := right
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   467
"/        ]
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   468
"/    ].
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   469
"/    "not reached"
1379
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   470
1380
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   471
    (sortBlock value:newBinaryTreeNode data value:data) ifTrue:[
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   472
        leftSubtree isNil ifTrue:[
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   473
            leftSubtree := newBinaryTreeNode.
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   474
        ] ifFalse:[
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   475
            leftSubtree insert:newBinaryTreeNode sortBlock:sortBlock
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   476
        ]
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   477
    ] ifFalse:[
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   478
        rightSubtree isNil ifTrue:[
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   479
            rightSubtree := newBinaryTreeNode.
1379
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   480
        ] ifFalse:[
1380
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   481
            rightSubtree insert:newBinaryTreeNode sortBlock:sortBlock
1379
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   482
        ]
1380
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   483
    ]
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   484
!
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   485
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   486
removeIdenticalValue:oldValue sortBlock:sortBlock
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   487
    "remove a value - returns a new treeNode, or nil if the value is not in the tree"
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   488
1475
37c5fb7333f7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1380
diff changeset
   489
    ^ self removeValue:oldValue using:#== sortBlock:sortBlock
37c5fb7333f7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1380
diff changeset
   490
!
37c5fb7333f7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1380
diff changeset
   491
37c5fb7333f7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1380
diff changeset
   492
removeValue:oldValue sortBlock:sortBlock
37c5fb7333f7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1380
diff changeset
   493
    "remove a value - returns a new treeNode, or nil if the value is not in the tree"
37c5fb7333f7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1380
diff changeset
   494
37c5fb7333f7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1380
diff changeset
   495
    ^ self removeValue:oldValue using:#= sortBlock:sortBlock
37c5fb7333f7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1380
diff changeset
   496
!
37c5fb7333f7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1380
diff changeset
   497
37c5fb7333f7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1380
diff changeset
   498
removeValue:oldValue using:compareOp sortBlock:sortBlock
37c5fb7333f7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1380
diff changeset
   499
    "remove a value - returns a new treeNode, or nil if the value is not in the tree"
1380
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   500
1475
37c5fb7333f7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1380
diff changeset
   501
    |thisIsMyNode newTop|
37c5fb7333f7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1380
diff changeset
   502
37c5fb7333f7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1380
diff changeset
   503
    "/ speed hack - avoids message sends
37c5fb7333f7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1380
diff changeset
   504
    compareOp == #== ifTrue:[
37c5fb7333f7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1380
diff changeset
   505
        thisIsMyNode := (data == oldValue).
37c5fb7333f7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1380
diff changeset
   506
    ] ifFalse:[
37c5fb7333f7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1380
diff changeset
   507
        compareOp == #= ifTrue:[
37c5fb7333f7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1380
diff changeset
   508
            thisIsMyNode := (data = oldValue).
37c5fb7333f7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1380
diff changeset
   509
        ] ifFalse:[
37c5fb7333f7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1380
diff changeset
   510
            thisIsMyNode := data perform:compareOp with:oldValue.
37c5fb7333f7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1380
diff changeset
   511
        ].
37c5fb7333f7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1380
diff changeset
   512
    ].
37c5fb7333f7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1380
diff changeset
   513
37c5fb7333f7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1380
diff changeset
   514
    thisIsMyNode ifTrue:[
1380
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   515
        leftSubtree isNil ifTrue:[
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   516
            ^ rightSubtree
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   517
        ].
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   518
        rightSubtree isNil ifTrue:[
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   519
            ^ leftSubtree
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   520
        ].
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   521
        newTop := self removeLeftRightMostNode.
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   522
        newTop leftSubtree:leftSubtree.
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   523
        newTop rightSubtree:rightSubtree.
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   524
        ^ newTop.
1379
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   525
    ].
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   526
1380
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   527
    (sortBlock value:oldValue value:data) ifTrue:[
1475
37c5fb7333f7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1380
diff changeset
   528
        "/ the value should be in the left half.
1380
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   529
        leftSubtree isNil ifTrue:[
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   530
            ^ nil
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   531
        ].
1475
37c5fb7333f7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1380
diff changeset
   532
        leftSubtree := leftSubtree removeValue:oldValue using:compareOp sortBlock:sortBlock.
37c5fb7333f7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1380
diff changeset
   533
    ] ifFalse:[
37c5fb7333f7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1380
diff changeset
   534
        "/ the value should be in the right half.
1380
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   535
        rightSubtree isNil ifTrue:[
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   536
            ^ nil
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   537
        ].
1475
37c5fb7333f7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1380
diff changeset
   538
        rightSubtree := rightSubtree removeValue:oldValue using:compareOp sortBlock:sortBlock.
1380
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   539
    ].
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   540
    ^ self. 
1379
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   541
! !
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   542
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   543
!BinaryTree::BinaryTreeNode methodsFor:'printing'!
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   544
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   545
printOn: aStream
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   546
    "Append the ascii representation to aStream"
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   547
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   548
    data isNil
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   549
        ifTrue: [aStream nextPutAll: '--']
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   550
        ifFalse: [
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   551
            aStream nextPut: $(.
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   552
            data printOn: aStream. aStream nextPut: $ .
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   553
            leftSubtree printOn: aStream. aStream nextPut: $ .
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   554
            rightSubtree printOn: aStream.
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   555
            aStream nextPut: $)]
1475
37c5fb7333f7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1380
diff changeset
   556
!
37c5fb7333f7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1380
diff changeset
   557
37c5fb7333f7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1380
diff changeset
   558
printOn:aStream indent:i
37c5fb7333f7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1380
diff changeset
   559
    "Append the graphical ascii representation to aStream"
37c5fb7333f7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1380
diff changeset
   560
37c5fb7333f7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1380
diff changeset
   561
    data isNil
37c5fb7333f7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1380
diff changeset
   562
        ifTrue: [aStream spaces:i. aStream nextPutAll: '--']
37c5fb7333f7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1380
diff changeset
   563
        ifFalse: [
37c5fb7333f7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1380
diff changeset
   564
            aStream spaces:i. aStream nextPut: $(.
37c5fb7333f7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1380
diff changeset
   565
            data printOn: aStream. 
37c5fb7333f7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1380
diff changeset
   566
            aStream cr.
37c5fb7333f7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1380
diff changeset
   567
            leftSubtree isNil 
37c5fb7333f7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1380
diff changeset
   568
                ifTrue:[ aStream spaces:i+2. '--' printOn: aStream]
37c5fb7333f7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1380
diff changeset
   569
                ifFalse:[ leftSubtree printOn: aStream indent:i+2 ]. 
37c5fb7333f7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1380
diff changeset
   570
            aStream cr.
37c5fb7333f7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1380
diff changeset
   571
            rightSubtree isNil 
37c5fb7333f7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1380
diff changeset
   572
                ifTrue:[ aStream spaces:i+2. '--' printOn: aStream]
37c5fb7333f7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1380
diff changeset
   573
                ifFalse:[ rightSubtree printOn: aStream indent:i+2 ]. 
37c5fb7333f7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1380
diff changeset
   574
            aStream nextPut: $)
37c5fb7333f7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1380
diff changeset
   575
        ]
1379
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   576
! !
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   577
1380
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   578
!BinaryTree::BinaryTreeNode methodsFor:'private helpers'!
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   579
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   580
removeLeftRightMostNode
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   581
    |rightMost|
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   582
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   583
    leftSubtree rightSubtree isNil ifTrue:[
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   584
        rightMost := leftSubtree.
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   585
        leftSubtree := leftSubtree leftSubtree.
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   586
        ^ rightMost.
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   587
    ].
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   588
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   589
    ^ leftSubtree removeRightMostNode
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   590
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   591
    "
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   592
     |tree|
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   593
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   594
     tree := BinaryTreeNode data:4.
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   595
     #(2 6 1 3 5 7)
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   596
     do:[:word |
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   597
         tree insert:(BinaryTreeNode data:word).
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   598
     ].
1475
37c5fb7333f7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1380
diff changeset
   599
     tree printOn:Transcript indent:0. Transcript cr.
37c5fb7333f7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1380
diff changeset
   600
     '---------------------------' printOn:Transcript. Transcript cr.
1380
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   601
     tree removeLeftRightMostNode.
1475
37c5fb7333f7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1380
diff changeset
   602
     tree printOn:Transcript indent:0. Transcript cr.
1380
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   603
    "
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   604
!
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   605
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   606
removeRightMostNode
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   607
    |removedNode|
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   608
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   609
    rightSubtree isNil ifTrue:[
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   610
        self error:'should not happen'
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   611
    ].
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   612
    rightSubtree rightSubtree notNil ifTrue:[
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   613
        ^ rightSubtree removeRightMostNode.
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   614
    ].
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   615
    removedNode := rightSubtree.
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   616
    rightSubtree := nil.
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   617
    ^ removedNode
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   618
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   619
    "
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   620
     |tree|
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   621
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   622
     tree := BinaryTreeNode data:4.
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   623
     #(2 6 1 3 5 7)
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   624
     do:[:word |
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   625
         tree insert:(BinaryTreeNode data:word).
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   626
     ].
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   627
     Transcript showCR:tree.
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   628
     Transcript showCR:(tree removeLeftRightMostNode). 
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   629
     Transcript showCR:tree.
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   630
    "
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   631
! !
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   632
1379
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   633
!BinaryTree::BinaryTreeNode methodsFor:'queries'!
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   634
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   635
depth
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   636
    "Returns the depth of the binary list"
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   637
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   638
    ^ self level - 1.
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   639
!
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   640
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   641
getTreeWithAnInteger: anInteger
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   642
    "Private - Returns the BinaryTree with data anInteger.  
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   643
     If anInteger not in the tree it returns nil."
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   644
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   645
    self inOrderDo: [:each| each data = anInteger ifTrue:[^each]].
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   646
    ^nil.
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   647
!
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   648
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   649
inOrderSuccessor
1380
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   650
    "Returns the in-order successor the of receiver.
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   651
     (that is the leftMost node on the right side)
1379
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   652
     If receiver is empty then returns the receiver."
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   653
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   654
    rightSubtree isNil ifTrue:[^ self].
1380
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   655
    ^ rightSubtree leftMostNode
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   656
!
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   657
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   658
includesIdenticalValue:aValue sortBlock:sortBlock
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   659
    "return true, if aValue is contained as some node's data"
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   660
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   661
    data == aValue ifTrue:[ ^ true ].
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   662
    (sortBlock value:aValue value:data) ifTrue:[
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   663
        leftSubtree isNil ifTrue:[
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   664
            ^ false
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   665
        ].
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   666
        ^ leftSubtree includesIdenticalValue:aValue sortBlock:sortBlock.
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   667
    ].
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   668
    rightSubtree isNil ifTrue:[
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   669
        ^ false
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   670
    ].
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   671
    ^ rightSubtree includesIdenticalValue:aValue sortBlock:sortBlock.
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   672
!
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   673
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   674
includesValue:aValue sortBlock:sortBlock
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   675
    "return true, if some node's data is equal to aValue"
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   676
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   677
    data = aValue ifTrue:[ ^ true ].
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   678
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   679
    (sortBlock value:aValue value:data) ifTrue:[
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   680
        leftSubtree isNil ifTrue:[
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   681
            ^ false
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   682
        ].
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   683
        ^ leftSubtree includesIdenticalValue:aValue.
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   684
    ].
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   685
    rightSubtree isNil ifTrue:[
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   686
        ^ false
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   687
    ].
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   688
    ^ rightSubtree includesIdenticalValue:aValue.
1379
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   689
!
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   690
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   691
isEmpty
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   692
    "returns true if the binary tree is empty and false otherwise"
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   693
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   694
    ^ data isNil
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   695
!
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   696
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   697
isLeaf
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   698
    "Returns true if self is a leaf"
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   699
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   700
    ^ ((leftSubtree isNil) and: [rightSubtree isNil])
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   701
!
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   702
1380
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   703
leftMostNode
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   704
    "Returns the leftMost (smallest-valued) node"
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   705
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   706
    leftSubtree isNil ifTrue:[^ self].
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   707
    ^ leftSubtree leftMostNode
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   708
!
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   709
1379
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   710
level
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   711
    "Returns the depth of the binary tree"
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   712
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   713
    |l|
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   714
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   715
    l := 0.
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   716
    leftSubtree notNil ifTrue:[
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   717
        l := leftSubtree level
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   718
    ].
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   719
    rightSubtree notNil ifTrue:[
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   720
        l := l max:(rightSubtree level)
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   721
    ].
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   722
    ^ l + 1
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   723
!
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   724
1380
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   725
rightMostNode
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   726
    "Returns the rightMost (largest-valued) node"
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   727
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   728
    rightSubtree isNil ifTrue:[^ self].
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   729
    ^ rightSubtree rightMostNode
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   730
!
60a7125ce957 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1379
diff changeset
   731
1379
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   732
size
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   733
    "Returns the size of the binary tree by traversing each element inorder"
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   734
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   735
    |count|
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   736
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   737
    count := 0.
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   738
    self inOrderDo: [:each | count := count + 1].
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   739
    ^ count
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   740
! !
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   741
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   742
!BinaryTree class methodsFor:'documentation'!
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   743
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   744
version
1628
0c7d951c6f99 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1625
diff changeset
   745
    ^ '$Header: /cvs/stx/stx/libbasic2/BinaryTree.st,v 1.5 2006-04-13 15:21:14 cg Exp $'
1379
ff2b64379b66 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   746
! !