1
1
import 'adt/binary_tree_adt.dart' ;
2
- import 'binary_tree.dart' ;
2
+ // import 'binary_tree.dart';
3
3
4
4
/// Data structure similar to [BinaryNode] , differs in having two boolean values
5
5
/// [leftIsThread] and [rightIsThread] to determine whether [left] and [right]
6
6
/// are threads or point to a child instead.
7
7
class ThreadedBinaryNode <V extends Comparable >
8
- extends BinaryNodeADT <ThreadedBinaryNode , V > {
9
- V value;
8
+ extends BinaryNodeADT <ThreadedBinaryNode < V > , V > {
9
+ V ? value;
10
10
11
11
/// Stores if [left] is a thread.
12
- bool leftIsThread;
12
+ bool ? leftIsThread;
13
13
14
14
/// Stores if [right] is a thread.
15
- bool rightIsThread;
15
+ bool ? rightIsThread;
16
16
17
17
ThreadedBinaryNode (this .value,
18
18
{this .leftIsThread = true , this .rightIsThread = true });
@@ -25,8 +25,8 @@ class ThreadedBinaryNode<V extends Comparable>
25
25
/// (if it exists), and all [left] pointers that would normally be null point
26
26
/// to the in-order predecessor of the node.
27
27
class ThreadedBinaryTree <V extends Comparable >
28
- extends BinaryTreeADT <ThreadedBinaryNode , V > {
29
- ThreadedBinaryNode root;
28
+ extends BinaryTreeADT <ThreadedBinaryNode < V > , V > {
29
+ ThreadedBinaryNode < V > ? root;
30
30
31
31
/// Creates an empty Threaded Binary tree.
32
32
ThreadedBinaryTree ();
@@ -49,17 +49,17 @@ class ThreadedBinaryTree<V extends Comparable>
49
49
return ;
50
50
}
51
51
52
- ThreadedBinaryNode parent, node = root ;
53
- var isPresent = false ;
52
+ late ThreadedBinaryNode < V > parent;
53
+ var node = root, isPresent = false ;
54
54
55
55
while (node != null ) {
56
- if (node.value.compareTo (value) == 0 ) {
56
+ if (node.value! .compareTo (value) == 0 ) {
57
57
isPresent = true ;
58
58
break ;
59
59
}
60
60
61
61
parent = node;
62
- if (node.value.compareTo (value) > 0 ) {
62
+ if (node.value! .compareTo (value) > 0 ) {
63
63
if (! (node.leftIsThread ?? true )) {
64
64
node = node.left;
65
65
} else {
@@ -75,7 +75,7 @@ class ThreadedBinaryTree<V extends Comparable>
75
75
if (! isPresent) {
76
76
var newNode = ThreadedBinaryNode (value);
77
77
78
- if (parent.value.compareTo (value) > 0 ) {
78
+ if (parent.value! .compareTo (value) > 0 ) {
79
79
newNode.left = parent.left;
80
80
newNode.right = parent;
81
81
@@ -97,39 +97,42 @@ class ThreadedBinaryTree<V extends Comparable>
97
97
}
98
98
}
99
99
100
+ @override
101
+ bool contains (V value) => inOrder ().contains (value);
102
+
100
103
@override
101
104
void delete (V value) {
102
- ThreadedBinaryNode parent, node = root ;
103
- var isPresent = false ;
105
+ ThreadedBinaryNode < V > ? parent;
106
+ var node = root, isPresent = false ;
104
107
105
108
while (node != null ) {
106
- if (node.value.compareTo (value) == 0 ) {
109
+ if (node.value! .compareTo (value) == 0 ) {
107
110
isPresent = true ;
108
111
break ;
109
112
}
110
113
111
114
parent = node;
112
- if (node.value.compareTo (value) > 0 ) {
113
- if (! node.leftIsThread) {
115
+ if (node.value! .compareTo (value) > 0 ) {
116
+ if (! ( node.leftIsThread ?? true ) ) {
114
117
node = node.left;
115
118
} else {
116
119
break ;
117
120
}
118
- } else if (! node.rightIsThread) {
121
+ } else if (! ( node.rightIsThread ?? true ) ) {
119
122
node = node.right;
120
123
} else {
121
124
break ;
122
125
}
123
126
}
124
127
125
128
if (isPresent) {
126
- if (! node.leftIsThread && ! node.rightIsThread) {
129
+ if (! ( node! .leftIsThread ?? true ) && ! ( node.rightIsThread ?? true ) ) {
127
130
// Node has 2 children.
128
131
_delete (parent, node, _DeleteCase .twoChildren);
129
- } else if (! node.leftIsThread) {
132
+ } else if (! ( node.leftIsThread ?? true ) ) {
130
133
// Node has only a left child.
131
134
_delete (parent, node, _DeleteCase .oneChild);
132
- } else if (! node.rightIsThread) {
135
+ } else if (! ( node.rightIsThread ?? true ) ) {
133
136
// Node has only a right child.
134
137
_delete (parent, node, _DeleteCase .oneChild);
135
138
} else {
@@ -145,12 +148,12 @@ class ThreadedBinaryTree<V extends Comparable>
145
148
if (isEmpty) return result;
146
149
147
150
var node = root;
148
- while (node.leftIsThread != null ) {
151
+ while (node! .leftIsThread != null ) {
149
152
node = node.left;
150
153
}
151
154
152
155
while (node != null ) {
153
- result.add (node.value);
156
+ result.add (node.value! );
154
157
node = _inOrderSuccessor (node);
155
158
}
156
159
return result;
@@ -163,7 +166,7 @@ class ThreadedBinaryTree<V extends Comparable>
163
166
164
167
var node = root;
165
168
while (node != null ) {
166
- result.add (node.value);
169
+ result.add (node.value! );
167
170
if (! (node.leftIsThread ?? true )) {
168
171
node = node.left;
169
172
} else if (! (node.rightIsThread ?? true )) {
@@ -181,23 +184,23 @@ class ThreadedBinaryTree<V extends Comparable>
181
184
return result;
182
185
}
183
186
184
- void _delete (ThreadedBinaryNode parent, ThreadedBinaryNode node,
187
+ void _delete (ThreadedBinaryNode < V > ? parent, ThreadedBinaryNode < V > node,
185
188
_DeleteCase deleteCase) {
186
189
switch (deleteCase) {
187
190
case _DeleteCase .childless:
188
191
if (parent == null ) {
189
192
nullify ();
190
193
} else if (node == parent.left) {
191
- parent.leftIsThread = true ;
194
+ parent.leftIsThread = node.leftIsThread == null ? null : true ;
192
195
parent.left = node.left;
193
196
} else {
194
- parent.rightIsThread = true ;
197
+ parent.rightIsThread = node.rightIsThread == null ? null : true ;
195
198
parent.right = node.right;
196
199
}
197
200
break ;
198
201
199
202
case _DeleteCase .oneChild:
200
- var child = node.leftIsThread ? node.right : node.left;
203
+ var child = node.leftIsThread! ? node.right : node.left;
201
204
202
205
if (parent == null ) {
203
206
root = child;
@@ -209,28 +212,26 @@ class ThreadedBinaryTree<V extends Comparable>
209
212
210
213
var successor = _inOrderSuccessor (node);
211
214
var predecessor = _inOrderPredecessor (node);
212
- if (! node.leftIsThread) {
213
- predecessor.right = successor;
215
+ if (! ( node.leftIsThread ?? true ) ) {
216
+ predecessor! .right = successor;
214
217
} else {
215
- if (! node.rightIsThread) {
216
- successor.left = predecessor;
218
+ if (! ( node.rightIsThread ?? true ) ) {
219
+ successor! .left = predecessor;
217
220
}
218
221
}
219
222
break ;
220
223
221
224
case _DeleteCase .twoChildren:
222
- ThreadedBinaryNode successor, parentSuccessor;
223
- parentSuccessor = node;
224
- successor = node.right;
225
+ var successor = node.right! , parentSuccessor = node;
225
226
226
- while (successor.left != null ) {
227
+ while (successor.left != null && ! successor.leftIsThread ! ) {
227
228
parentSuccessor = successor;
228
- successor = successor.left;
229
+ successor = successor.left! ;
229
230
}
230
231
231
232
node.value = successor.value;
232
233
233
- if (successor.leftIsThread && successor.rightIsThread) {
234
+ if (successor.leftIsThread! && ( successor.rightIsThread ?? true ) ) {
234
235
_delete (parentSuccessor, successor, _DeleteCase .childless);
235
236
} else {
236
237
_delete (parentSuccessor, successor, _DeleteCase .oneChild);
@@ -239,27 +240,27 @@ class ThreadedBinaryTree<V extends Comparable>
239
240
}
240
241
}
241
242
242
- ThreadedBinaryNode _inOrderPredecessor (ThreadedBinaryNode node) {
243
+ ThreadedBinaryNode < V > ? _inOrderPredecessor (ThreadedBinaryNode < V > node) {
243
244
if (node.leftIsThread ?? true ) {
244
245
return node.left;
245
246
} else {
246
- node = node.left;
247
+ node = node.left! ;
247
248
248
- while (! node.rightIsThread) {
249
- node = node.right;
249
+ while (! node.rightIsThread! ) {
250
+ node = node.right! ;
250
251
}
251
252
return node;
252
253
}
253
254
}
254
255
255
- ThreadedBinaryNode _inOrderSuccessor (ThreadedBinaryNode node) {
256
+ ThreadedBinaryNode < V > ? _inOrderSuccessor (ThreadedBinaryNode < V > node) {
256
257
if (node.rightIsThread ?? true ) {
257
258
return node.right;
258
259
} else {
259
- node = node.right;
260
+ node = node.right! ;
260
261
261
- while (! node.leftIsThread) {
262
- node = node.left;
262
+ while (! node.leftIsThread! ) {
263
+ node = node.left! ;
263
264
}
264
265
return node;
265
266
}
0 commit comments