@@ -16,9 +16,9 @@ class ThreadedBinaryNode<V extends Comparable>
16
16
17
17
ThreadedBinaryNode (this .value,
18
18
{this .leftIsThread = true , this .rightIsThread = true });
19
- }
20
19
21
- enum _DeleteCase { twoChildren, oneChild, childless }
20
+ ThreadedBinaryNode .root (this .value);
21
+ }
22
22
23
23
/// A [BinaryTree] is threaded by making all [right] pointers that would
24
24
/// normally be null point to the in-order successor of the node
@@ -28,8 +28,27 @@ class ThreadedBinaryTree<V extends Comparable>
28
28
extends BinaryTreeADT <ThreadedBinaryNode , V > {
29
29
ThreadedBinaryNode root;
30
30
31
+ /// Creates an empty Threaded Binary tree.
32
+ ThreadedBinaryTree ();
33
+
34
+ /// Creates a Threaded Binary tree with all the values of [list] .
35
+ ThreadedBinaryTree .fromList (List <V > list) {
36
+ for (var value in list) {
37
+ add (value);
38
+ }
39
+ }
40
+
41
+ /// Creates a new Threaded Binary tree with a single [value] .
42
+ ThreadedBinaryTree .withSingleValue (V value)
43
+ : root = ThreadedBinaryNode .root (value);
44
+
31
45
@override
32
46
void add (V value) {
47
+ if (isEmpty) {
48
+ root = ThreadedBinaryNode .root (value);
49
+ return ;
50
+ }
51
+
33
52
ThreadedBinaryNode parent, node = root;
34
53
var isPresent = false ;
35
54
@@ -41,12 +60,12 @@ class ThreadedBinaryTree<V extends Comparable>
41
60
42
61
parent = node;
43
62
if (node.value.compareTo (value) > 0 ) {
44
- if (! node.leftIsThread) {
63
+ if (! ( node.leftIsThread ?? true ) ) {
45
64
node = node.left;
46
65
} else {
47
66
break ;
48
67
}
49
- } else if (! node.rightIsThread) {
68
+ } else if (! ( node.rightIsThread ?? true ) ) {
50
69
node = node.right;
51
70
} else {
52
71
break ;
@@ -56,16 +75,22 @@ class ThreadedBinaryTree<V extends Comparable>
56
75
if (! isPresent) {
57
76
var newNode = ThreadedBinaryNode (value);
58
77
59
- if (parent == null ) {
60
- root = newNode;
61
- } else if (parent.value.compareTo (value) > 0 ) {
78
+ if (parent.value.compareTo (value) > 0 ) {
62
79
newNode.left = parent.left;
63
80
newNode.right = parent;
81
+
82
+ // Parent was the leftmost node of the tree.
83
+ newNode.leftIsThread = parent.leftIsThread ?? null ;
84
+
64
85
parent.leftIsThread = false ;
65
86
parent.left = newNode;
66
87
} else {
67
88
newNode.left = parent;
68
89
newNode.right = parent.right;
90
+
91
+ // Parent was the rightmost node of the tree.
92
+ newNode.rightIsThread = parent.rightIsThread ?? null ;
93
+
69
94
parent.rightIsThread = false ;
70
95
parent.right = newNode;
71
96
}
@@ -114,6 +139,48 @@ class ThreadedBinaryTree<V extends Comparable>
114
139
}
115
140
}
116
141
142
+ @override
143
+ List <V > inOrder () {
144
+ var result = < V > [];
145
+ if (isEmpty) return result;
146
+
147
+ var node = root;
148
+ while (node.leftIsThread != null ) {
149
+ node = node.left;
150
+ }
151
+
152
+ while (node != null ) {
153
+ result.add (node.value);
154
+ node = _inOrderSuccessor (node);
155
+ }
156
+ return result;
157
+ }
158
+
159
+ @override
160
+ List <V > preOrder () {
161
+ var result = < V > [];
162
+ if (isEmpty) return result;
163
+
164
+ var node = root;
165
+ while (node != null ) {
166
+ result.add (node.value);
167
+ if (! (node.leftIsThread ?? true )) {
168
+ node = node.left;
169
+ } else if (! (node.rightIsThread ?? true )) {
170
+ node = node.right;
171
+ } else {
172
+ while (node != null && (node.rightIsThread ?? false )) {
173
+ node = node.right;
174
+ }
175
+
176
+ if (node != null ) {
177
+ node = node.right;
178
+ }
179
+ }
180
+ }
181
+ return result;
182
+ }
183
+
117
184
void _delete (ThreadedBinaryNode parent, ThreadedBinaryNode node,
118
185
_DeleteCase deleteCase) {
119
186
switch (deleteCase) {
@@ -172,50 +239,21 @@ class ThreadedBinaryTree<V extends Comparable>
172
239
}
173
240
}
174
241
175
- @override
176
- List <V > inOrder () {
177
- var result = < V > [];
178
- if (isEmpty) return result;
179
-
180
- var node = root;
181
- while (! node.leftIsThread) {
242
+ ThreadedBinaryNode _inOrderPredecessor (ThreadedBinaryNode node) {
243
+ if (node.leftIsThread ?? true ) {
244
+ return node.left;
245
+ } else {
182
246
node = node.left;
183
- }
184
-
185
- while (node.rightIsThread) {
186
- result.add (node.value);
187
- node = _inOrderSuccessor (node);
188
- }
189
- return result;
190
- }
191
247
192
- @override
193
- List <V > preOrder () {
194
- var result = < V > [];
195
- if (isEmpty) return result;
196
-
197
- var node = root;
198
- while (node != null ) {
199
- result.add (node.value);
200
- if (! node.leftIsThread) {
201
- node = node.left;
202
- } else if (! node.rightIsThread) {
248
+ while (! node.rightIsThread) {
203
249
node = node.right;
204
- } else {
205
- while (node != null && node.rightIsThread) {
206
- node = node.right;
207
- }
208
-
209
- if (node != null ) {
210
- node = node.right;
211
- }
212
250
}
251
+ return node;
213
252
}
214
- return result;
215
253
}
216
254
217
255
ThreadedBinaryNode _inOrderSuccessor (ThreadedBinaryNode node) {
218
- if (node.rightIsThread) {
256
+ if (node.rightIsThread ?? true ) {
219
257
return node.right;
220
258
} else {
221
259
node = node.right;
@@ -226,17 +264,6 @@ class ThreadedBinaryTree<V extends Comparable>
226
264
return node;
227
265
}
228
266
}
229
-
230
- ThreadedBinaryNode _inOrderPredecessor (ThreadedBinaryNode node) {
231
- if (node.leftIsThread) {
232
- return node.left;
233
- } else {
234
- node = node.left;
235
-
236
- while (! node.rightIsThread) {
237
- node = node.right;
238
- }
239
- return node;
240
- }
241
- }
242
267
}
268
+
269
+ enum _DeleteCase { twoChildren, oneChild, childless }
0 commit comments