Skip to content

Commit 9bd1e14

Browse files
committed
save
1 parent 35554ea commit 9bd1e14

File tree

3 files changed

+187
-50
lines changed

3 files changed

+187
-50
lines changed

Diff for: lib/trees/threaded_binary_tree.dart

+47-46
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,18 @@
11
import 'adt/binary_tree_adt.dart';
2-
import 'binary_tree.dart';
2+
//import 'binary_tree.dart';
33

44
/// Data structure similar to [BinaryNode], differs in having two boolean values
55
/// [leftIsThread] and [rightIsThread] to determine whether [left] and [right]
66
/// are threads or point to a child instead.
77
class ThreadedBinaryNode<V extends Comparable>
8-
extends BinaryNodeADT<ThreadedBinaryNode, V> {
9-
V value;
8+
extends BinaryNodeADT<ThreadedBinaryNode<V>, V> {
9+
V? value;
1010

1111
/// Stores if [left] is a thread.
12-
bool leftIsThread;
12+
bool? leftIsThread;
1313

1414
/// Stores if [right] is a thread.
15-
bool rightIsThread;
15+
bool? rightIsThread;
1616

1717
ThreadedBinaryNode(this.value,
1818
{this.leftIsThread = true, this.rightIsThread = true});
@@ -25,8 +25,8 @@ class ThreadedBinaryNode<V extends Comparable>
2525
/// (if it exists), and all [left] pointers that would normally be null point
2626
/// to the in-order predecessor of the node.
2727
class ThreadedBinaryTree<V extends Comparable>
28-
extends BinaryTreeADT<ThreadedBinaryNode, V> {
29-
ThreadedBinaryNode root;
28+
extends BinaryTreeADT<ThreadedBinaryNode<V>, V> {
29+
ThreadedBinaryNode<V>? root;
3030

3131
/// Creates an empty Threaded Binary tree.
3232
ThreadedBinaryTree();
@@ -49,17 +49,17 @@ class ThreadedBinaryTree<V extends Comparable>
4949
return;
5050
}
5151

52-
ThreadedBinaryNode parent, node = root;
53-
var isPresent = false;
52+
late ThreadedBinaryNode<V> parent;
53+
var node = root, isPresent = false;
5454

5555
while (node != null) {
56-
if (node.value.compareTo(value) == 0) {
56+
if (node.value!.compareTo(value) == 0) {
5757
isPresent = true;
5858
break;
5959
}
6060

6161
parent = node;
62-
if (node.value.compareTo(value) > 0) {
62+
if (node.value!.compareTo(value) > 0) {
6363
if (!(node.leftIsThread ?? true)) {
6464
node = node.left;
6565
} else {
@@ -75,7 +75,7 @@ class ThreadedBinaryTree<V extends Comparable>
7575
if (!isPresent) {
7676
var newNode = ThreadedBinaryNode(value);
7777

78-
if (parent.value.compareTo(value) > 0) {
78+
if (parent.value!.compareTo(value) > 0) {
7979
newNode.left = parent.left;
8080
newNode.right = parent;
8181

@@ -97,39 +97,42 @@ class ThreadedBinaryTree<V extends Comparable>
9797
}
9898
}
9999

100+
@override
101+
bool contains(V value) => inOrder().contains(value);
102+
100103
@override
101104
void delete(V value) {
102-
ThreadedBinaryNode parent, node = root;
103-
var isPresent = false;
105+
ThreadedBinaryNode<V>? parent;
106+
var node = root, isPresent = false;
104107

105108
while (node != null) {
106-
if (node.value.compareTo(value) == 0) {
109+
if (node.value!.compareTo(value) == 0) {
107110
isPresent = true;
108111
break;
109112
}
110113

111114
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)) {
114117
node = node.left;
115118
} else {
116119
break;
117120
}
118-
} else if (!node.rightIsThread) {
121+
} else if (!(node.rightIsThread ?? true)) {
119122
node = node.right;
120123
} else {
121124
break;
122125
}
123126
}
124127

125128
if (isPresent) {
126-
if (!node.leftIsThread && !node.rightIsThread) {
129+
if (!(node!.leftIsThread ?? true) && !(node.rightIsThread ?? true)) {
127130
// Node has 2 children.
128131
_delete(parent, node, _DeleteCase.twoChildren);
129-
} else if (!node.leftIsThread) {
132+
} else if (!(node.leftIsThread ?? true)) {
130133
// Node has only a left child.
131134
_delete(parent, node, _DeleteCase.oneChild);
132-
} else if (!node.rightIsThread) {
135+
} else if (!(node.rightIsThread ?? true)) {
133136
// Node has only a right child.
134137
_delete(parent, node, _DeleteCase.oneChild);
135138
} else {
@@ -145,12 +148,12 @@ class ThreadedBinaryTree<V extends Comparable>
145148
if (isEmpty) return result;
146149

147150
var node = root;
148-
while (node.leftIsThread != null) {
151+
while (node!.leftIsThread != null) {
149152
node = node.left;
150153
}
151154

152155
while (node != null) {
153-
result.add(node.value);
156+
result.add(node.value!);
154157
node = _inOrderSuccessor(node);
155158
}
156159
return result;
@@ -163,7 +166,7 @@ class ThreadedBinaryTree<V extends Comparable>
163166

164167
var node = root;
165168
while (node != null) {
166-
result.add(node.value);
169+
result.add(node.value!);
167170
if (!(node.leftIsThread ?? true)) {
168171
node = node.left;
169172
} else if (!(node.rightIsThread ?? true)) {
@@ -181,23 +184,23 @@ class ThreadedBinaryTree<V extends Comparable>
181184
return result;
182185
}
183186

184-
void _delete(ThreadedBinaryNode parent, ThreadedBinaryNode node,
187+
void _delete(ThreadedBinaryNode<V>? parent, ThreadedBinaryNode<V> node,
185188
_DeleteCase deleteCase) {
186189
switch (deleteCase) {
187190
case _DeleteCase.childless:
188191
if (parent == null) {
189192
nullify();
190193
} else if (node == parent.left) {
191-
parent.leftIsThread = true;
194+
parent.leftIsThread = node.leftIsThread == null ? null : true;
192195
parent.left = node.left;
193196
} else {
194-
parent.rightIsThread = true;
197+
parent.rightIsThread = node.rightIsThread == null ? null : true;
195198
parent.right = node.right;
196199
}
197200
break;
198201

199202
case _DeleteCase.oneChild:
200-
var child = node.leftIsThread ? node.right : node.left;
203+
var child = node.leftIsThread! ? node.right : node.left;
201204

202205
if (parent == null) {
203206
root = child;
@@ -209,28 +212,26 @@ class ThreadedBinaryTree<V extends Comparable>
209212

210213
var successor = _inOrderSuccessor(node);
211214
var predecessor = _inOrderPredecessor(node);
212-
if (!node.leftIsThread) {
213-
predecessor.right = successor;
215+
if (!(node.leftIsThread ?? true)) {
216+
predecessor!.right = successor;
214217
} else {
215-
if (!node.rightIsThread) {
216-
successor.left = predecessor;
218+
if (!(node.rightIsThread ?? true)) {
219+
successor!.left = predecessor;
217220
}
218221
}
219222
break;
220223

221224
case _DeleteCase.twoChildren:
222-
ThreadedBinaryNode successor, parentSuccessor;
223-
parentSuccessor = node;
224-
successor = node.right;
225+
var successor = node.right!, parentSuccessor = node;
225226

226-
while (successor.left != null) {
227+
while (successor.left != null && !successor.leftIsThread!) {
227228
parentSuccessor = successor;
228-
successor = successor.left;
229+
successor = successor.left!;
229230
}
230231

231232
node.value = successor.value;
232233

233-
if (successor.leftIsThread && successor.rightIsThread) {
234+
if (successor.leftIsThread! && (successor.rightIsThread ?? true)) {
234235
_delete(parentSuccessor, successor, _DeleteCase.childless);
235236
} else {
236237
_delete(parentSuccessor, successor, _DeleteCase.oneChild);
@@ -239,27 +240,27 @@ class ThreadedBinaryTree<V extends Comparable>
239240
}
240241
}
241242

242-
ThreadedBinaryNode _inOrderPredecessor(ThreadedBinaryNode node) {
243+
ThreadedBinaryNode<V>? _inOrderPredecessor(ThreadedBinaryNode<V> node) {
243244
if (node.leftIsThread ?? true) {
244245
return node.left;
245246
} else {
246-
node = node.left;
247+
node = node.left!;
247248

248-
while (!node.rightIsThread) {
249-
node = node.right;
249+
while (!node.rightIsThread!) {
250+
node = node.right!;
250251
}
251252
return node;
252253
}
253254
}
254255

255-
ThreadedBinaryNode _inOrderSuccessor(ThreadedBinaryNode node) {
256+
ThreadedBinaryNode<V>? _inOrderSuccessor(ThreadedBinaryNode<V> node) {
256257
if (node.rightIsThread ?? true) {
257258
return node.right;
258259
} else {
259-
node = node.right;
260+
node = node.right!;
260261

261-
while (!node.leftIsThread) {
262-
node = node.left;
262+
while (!node.leftIsThread!) {
263+
node = node.left!;
263264
}
264265
return node;
265266
}

Diff for: test/trees/red_black_tree_test.dart

+1
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,7 @@ void main() {
8585
});
8686
});
8787

88+
// TODO: Use isTrue, isFalse and equals().
8889
test('Add node', () {
8990
var test = RedBlackTree();
9091
var list = test.inOrder();

0 commit comments

Comments
 (0)