diff --git a/.idea/modules.xml b/.idea/modules.xml
index a70c1e5..7080f2f 100644
--- a/.idea/modules.xml
+++ b/.idea/modules.xml
@@ -88,6 +88,7 @@
+
diff --git a/85-BreadthFirstSearch/85-BreadthFirstSearch.iml b/85-BreadthFirstSearch/85-BreadthFirstSearch.iml
index a837bcd..e2313d5 100644
--- a/85-BreadthFirstSearch/85-BreadthFirstSearch.iml
+++ b/85-BreadthFirstSearch/85-BreadthFirstSearch.iml
@@ -1,7 +1,7 @@
-
+
diff --git a/86-BinarySearchTree/86-BinarySearchTree.iml b/86-BinarySearchTree/86-BinarySearchTree.iml
new file mode 100644
index 0000000..7ae026d
--- /dev/null
+++ b/86-BinarySearchTree/86-BinarySearchTree.iml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/86-BinarySearchTree/out/production/BinarySearchTree.class b/86-BinarySearchTree/out/production/BinarySearchTree.class
new file mode 100644
index 0000000..39bb529
Binary files /dev/null and b/86-BinarySearchTree/out/production/BinarySearchTree.class differ
diff --git a/86-BinarySearchTree/out/production/Main.class b/86-BinarySearchTree/out/production/Main.class
new file mode 100644
index 0000000..305f5a3
Binary files /dev/null and b/86-BinarySearchTree/out/production/Main.class differ
diff --git a/86-BinarySearchTree/out/production/Node.class b/86-BinarySearchTree/out/production/Node.class
new file mode 100644
index 0000000..f8694e5
Binary files /dev/null and b/86-BinarySearchTree/out/production/Node.class differ
diff --git a/86-BinarySearchTree/src/BinarySearchTree.java b/86-BinarySearchTree/src/BinarySearchTree.java
new file mode 100644
index 0000000..fcf84fd
--- /dev/null
+++ b/86-BinarySearchTree/src/BinarySearchTree.java
@@ -0,0 +1,108 @@
+public class BinarySearchTree {
+
+ Node root;
+
+ public void insert(Node node) {
+
+ root = insertHelper(root, node);
+ }
+
+ private Node insertHelper(Node root, Node node) {
+
+ int data = node.data;
+
+ if (root == null) {
+ root = node;
+ return root;
+ } else if (data < root.data) {
+ root.left = insertHelper(root.left, node);
+ } else {
+ root.right = insertHelper(root.right, node);
+ }
+ return root;
+ }
+
+ public void display() {
+
+ displayHelper(root);
+ }
+
+ private void displayHelper(Node root) {
+
+ if (root != null) {
+ /*If we want ascending order we start from the left side of the root,
+ * otherwise we start from the right side*/
+ displayHelper(root.left);
+ System.out.println(root.data);
+ displayHelper(root.right);
+ }
+ }
+
+ public boolean search(int data) {
+
+ return searchHelper(root, data);
+ }
+
+ private boolean searchHelper(Node root, int data) {
+
+ if (root == null) {
+ return false;
+ } else if (root.data == data) {
+ return true;
+ } else if (root.data > data) {
+ return searchHelper(root.left, data);
+ } else {
+ return searchHelper(root.right, data);
+ }
+ }
+
+ public void remove(int data) {
+
+ if (search(data)) {
+ removeHelper(root, data);
+ } else {
+ System.out.println(data + " could not be found");
+ }
+ }
+
+ public Node removeHelper(Node root, int data) {
+
+ if (root == null) {
+ return root;
+ } else if (data < root.data) {
+ root.left = removeHelper(root.left, data);
+ } else if (data > root.data) {
+ root.right = removeHelper(root.right, data);
+ } else { // node found
+ if (root.left == null && root.right == null) {
+ root = null;
+ } else if (root.right != null) { //find a successor to replace this node
+ root.data = successor(root);
+ root.right = removeHelper(root.right, root.data);
+ } else { //find predecessor to replace this node
+ root.data = predecessor(root);
+ root.left = removeHelper(root.left, root.data);
+ }
+ }
+
+ return root;
+ }
+
+ private int successor(Node root) { //find the least value below the right child of this root node
+ root = root.right;
+
+ while (root.left != null) {
+ root = root.left;
+ }
+ return root.data;
+ }
+
+ private int predecessor(Node root) { //find the greatest value below the left child of this root node
+ root = root.left;
+
+ while (root.right != null) {
+ root = root.right;
+ }
+ return root.data;
+ }
+}
diff --git a/86-BinarySearchTree/src/Main.java b/86-BinarySearchTree/src/Main.java
new file mode 100644
index 0000000..d818152
--- /dev/null
+++ b/86-BinarySearchTree/src/Main.java
@@ -0,0 +1,32 @@
+public class Main {
+ public static void main(String[] args) {
+
+ //Binary Search Tree - A tree data structure, where each node is greater than it's left child,
+ //but less than it's right.
+
+ //benefit: easy to locate a node when they are in this order
+
+ //time complexity: best case O(log n)
+ // worst case O(n)
+
+ //space complexity: O(n)
+
+ BinarySearchTree tree = new BinarySearchTree();
+
+ tree.insert(new Node(5));
+ tree.insert(new Node(1));
+ tree.insert(new Node(9));
+ tree.insert(new Node(7));
+ tree.insert(new Node(3));
+ tree.insert(new Node(6));
+ tree.insert(new Node(4));
+ tree.insert(new Node(8));
+ tree.insert(new Node(2));
+
+ tree.remove(4);
+ tree.display();
+
+ //System.out.println(tree.search(10));
+
+ }
+}
diff --git a/86-BinarySearchTree/src/Node.java b/86-BinarySearchTree/src/Node.java
new file mode 100644
index 0000000..dcea681
--- /dev/null
+++ b/86-BinarySearchTree/src/Node.java
@@ -0,0 +1,10 @@
+public class Node {
+
+ int data;
+ Node left;
+ Node right;
+
+ public Node(int data) {
+ this.data = data;
+ }
+}