Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
539 changes: 374 additions & 165 deletions lib/trees/avl_tree.dart

Large diffs are not rendered by default.

23 changes: 11 additions & 12 deletions lib/trees/binary_search_tree.dart
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
// @dart=2.9
import 'adt/binary_tree_adt.dart';
import 'binary_tree.dart';

Expand All @@ -11,7 +10,7 @@ import 'binary_tree.dart';
class BinarySearchTree<V extends Comparable>
extends BinaryTreeADT<BinaryNode<V>, V> {
/// Root of the tree
BinaryNode<V> root;
BinaryNode<V>? root;

/// Creates an empty BST.
BinarySearchTree();
Expand All @@ -32,7 +31,7 @@ class BinarySearchTree<V extends Comparable>
if (isEmpty) {
root = node;
} else {
_compareAndAdd(root, node);
_compareAndAdd(root!, node);
}
}

Expand All @@ -48,7 +47,7 @@ class BinarySearchTree<V extends Comparable>
@override
void delete(V value) {
if (!isEmpty) {
root = _delete(root, value);
root = _delete(root!, value);
}
}

Expand All @@ -66,30 +65,30 @@ class BinarySearchTree<V extends Comparable>
return;
}

if (node.value.compareTo(newNode.value) > 0) {
if (node.value!.compareTo(newNode.value) > 0) {
if (node.left == null) {
// newNode has lower value and becomes left child of the node.
node.left = newNode;
} else {
_compareAndAdd(node.left, newNode);
_compareAndAdd(node.left!, newNode);
}
} else {
if (node.right == null) {
// newNode has greater value and becomes right child of node.
node.right = newNode;
} else {
_compareAndAdd(node.right, newNode);
_compareAndAdd(node.right!, newNode);
}
}
}

BinaryNode<V> _delete(BinaryNode node, V value) {
BinaryNode<V>? _delete(BinaryNode<V>? node, V value) {
// Base Case, Key not found
if (node == null) return node;

if (node.value.compareTo(value) > 0) {
if (node.value!.compareTo(value) > 0) {
node.left = _delete(node.left, value);
} else if (node.value.compareTo(value) < 0) {
} else if (node.value!.compareTo(value) < 0) {
node.right = _delete(node.right, value);
} else {
// Node with value found.
Expand All @@ -98,11 +97,11 @@ class BinarySearchTree<V extends Comparable>
if (node.left != null && node.right != null) {
// Successor to the node is the next inOrder node.
var successor = node.right;
while (successor.left != null) {
while (successor!.left != null) {
successor = successor.left;
}
node.value = successor.value;
node.right = _delete(node.right, successor.value);
node.right = _delete(node.right, successor.value!);
} else {
if (node.left != null) {
// Node only has left child.
Expand Down
5 changes: 2 additions & 3 deletions lib/trees/binary_tree.dart
Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@
// @dart=2.9
import 'adt/binary_tree_adt.dart';

/// A binary node has at most two children, which are referred to as the
/// [left] child and the [right] child.
class BinaryNode<V extends Comparable> extends BinaryNodeADT<BinaryNode<V>, V> {
V value;
V? value;

/// Creates a node with [value].
BinaryNode(this.value);
Expand All @@ -14,7 +13,7 @@ class BinaryNode<V extends Comparable> extends BinaryNodeADT<BinaryNode<V>, V> {
/// [BinaryNode]s (starting at a [root] node).
class BinaryTree<V extends Comparable> {
/// Root of tree.
BinaryNode root;
BinaryNode? root;

/// Creates an empty Binary tree.
BinaryTree();
Expand Down
Loading