From a4ba85751bd49203dedda850ccb126518a765efe Mon Sep 17 00:00:00 2001 From: "artemy.ozerski" Date: Sat, 24 Aug 2024 18:41:46 +0300 Subject: [PATCH 01/24] added BST --- src/main/java/com/treelibrary/BST.java | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 src/main/java/com/treelibrary/BST.java diff --git a/src/main/java/com/treelibrary/BST.java b/src/main/java/com/treelibrary/BST.java new file mode 100644 index 0000000..1404a8b --- /dev/null +++ b/src/main/java/com/treelibrary/BST.java @@ -0,0 +1,5 @@ +package com.treelibrary; + +public class BST { + +} From c24f4d318f7ac185d21e57533c961c63d11e71bf Mon Sep 17 00:00:00 2001 From: "artemy.ozerski" Date: Sat, 24 Aug 2024 19:14:01 +0300 Subject: [PATCH 02/24] BST & Node interface --- src/main/java/com/treelibrary/BST.java | 37 +++++++++++++++- .../java/com/treelibrary/Impl/NodeImpl.java | 44 +++++++++++++++++++ src/main/java/com/treelibrary/Node.java | 12 +++++ 3 files changed, 92 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/treelibrary/Impl/NodeImpl.java create mode 100644 src/main/java/com/treelibrary/Node.java diff --git a/src/main/java/com/treelibrary/BST.java b/src/main/java/com/treelibrary/BST.java index 1404a8b..a0a4115 100644 --- a/src/main/java/com/treelibrary/BST.java +++ b/src/main/java/com/treelibrary/BST.java @@ -1,5 +1,40 @@ package com.treelibrary; -public class BST { +import java.util.function.Consumer; +public interface BST { + + boolean isEmpty(); + int count(); + Node insert(T data); + Node find(T data); + T remove(Node node); + Node findMin(); + Node findMax(); + Node next(Node node); + Node prev(Node node); + + /** + * Traverses the BST in in-order and performs an action on each node. + * + * @param action the action to be performed on each node. + */ + void traverseInOrder(Consumer action); + + /** + * Traverses the BST in pre-order and performs an action on each node. + * + * @param action the action to be performed on each node. + */ + void traversePreOrder(Consumer action); + + /** + * Traverses the BST in post-order and performs an action on each node. + * + * @param action the action to be performed on each node. + */ + void traversePostOrder(Consumer action); + + int height(); + void clear(); } diff --git a/src/main/java/com/treelibrary/Impl/NodeImpl.java b/src/main/java/com/treelibrary/Impl/NodeImpl.java new file mode 100644 index 0000000..8abffbc --- /dev/null +++ b/src/main/java/com/treelibrary/Impl/NodeImpl.java @@ -0,0 +1,44 @@ +package com.treelibrary.Impl; + +import com.treelibrary.Node; +public class NodeImpl implements Node { + private T data; + private Node left; + private Node right; + + public NodeImpl(T data) { + this.data = data; + this.left = null; + this.right = null; + } + + @Override + public T getData() { + return data; + } + + @Override + public void setData(T data) { + this.data = data; + } + + @Override + public Node getLeft() { + return left; + } + + @Override + public void setLeft(Node left) { + this.left = left; + } + + @Override + public Node getRight() { + return right; + } + + @Override + public void setRight(Node right) { + this.right = right; + } +} diff --git a/src/main/java/com/treelibrary/Node.java b/src/main/java/com/treelibrary/Node.java new file mode 100644 index 0000000..0cc7cc3 --- /dev/null +++ b/src/main/java/com/treelibrary/Node.java @@ -0,0 +1,12 @@ +package com.treelibrary; + +public interface Node { + T getData(); + void setData(T data); + + Node getLeft(); + void setLeft(Node left); + + Node getRight(); + void setRight(Node right); +} From 9efc1ec299b40891db3c75a42aa2a91d252a7968 Mon Sep 17 00:00:00 2001 From: "artemy.ozerski" Date: Mon, 26 Aug 2024 13:48:35 +0300 Subject: [PATCH 03/24] tests folder created --- src/test/java/com/treelibrary/AppTest.java | 38 --------- src/test/java/com/treelibrary/BSTTest.java | 89 ++++++++++++++++++++++ src/test/java/com/treelibrary/Before.java | 5 ++ 3 files changed, 94 insertions(+), 38 deletions(-) delete mode 100644 src/test/java/com/treelibrary/AppTest.java create mode 100644 src/test/java/com/treelibrary/BSTTest.java create mode 100644 src/test/java/com/treelibrary/Before.java diff --git a/src/test/java/com/treelibrary/AppTest.java b/src/test/java/com/treelibrary/AppTest.java deleted file mode 100644 index e0f238f..0000000 --- a/src/test/java/com/treelibrary/AppTest.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.treelibrary; - -import junit.framework.Test; -import junit.framework.TestCase; -import junit.framework.TestSuite; - -/** - * Unit test for simple App. - */ -public class AppTest - extends TestCase -{ - /** - * Create the test case - * - * @param testName name of the test case - */ - public AppTest( String testName ) - { - super( testName ); - } - - /** - * @return the suite of tests being tested - */ - public static Test suite() - { - return new TestSuite( AppTest.class ); - } - - /** - * Rigourous Test :-) - */ - public void testApp() - { - assertTrue( true ); - } -} diff --git a/src/test/java/com/treelibrary/BSTTest.java b/src/test/java/com/treelibrary/BSTTest.java new file mode 100644 index 0000000..0a55dab --- /dev/null +++ b/src/test/java/com/treelibrary/BSTTest.java @@ -0,0 +1,89 @@ +package com.treelibrary; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + + + +import static org.junit.jupiter.api.Assertions.*; + +public class BSTTest { + + private BST bst; + + @Before + public void setUp() { + // Initialize your BST implementation here, e.g., bst = new BinarySearchTree<>(); + } + + @Test + public void testIsEmpty() { + // Test to check if BST is empty + } + + @Test + public void testInsert() { + // Test to insert elements and validate structure + } + + @Test + public void testCount() { + // Test to count the number of elements in the BST + } + + @Test + public void testFind() { + // Test to find an element in the BST + } + + @Test + public void testRemove() { + // Test to remove elements from the BST and validate the structure + } + + @Test + public void testFindMin() { + // Test to find the minimum value in the BST + } + + @Test + public void testFindMax() { + // Test to find the maximum value in the BST + } + + @Test + public void testNext() { + // Test to find the in-order successor of a given node + } + + @Test + public void testPrev() { + // Test to find the in-order predecessor of a given node + } + + @Test + public void testTraverseInOrder() { + // Test to traverse the BST in in-order and validate the traversal + } + + @Test + public void testTraversePreOrder() { + // Test to traverse the BST in pre-order and validate the traversal + } + + @Test + public void testTraversePostOrder() { + // Test to traverse the BST in post-order and validate the traversal + } + + @Test + public void testHeight() { + // Test to calculate the height of the BST + } + + @Test + public void testClear() { + // Test to clear the BST and validate it is empty afterwards + } +} diff --git a/src/test/java/com/treelibrary/Before.java b/src/test/java/com/treelibrary/Before.java new file mode 100644 index 0000000..8a71066 --- /dev/null +++ b/src/test/java/com/treelibrary/Before.java @@ -0,0 +1,5 @@ +package com.treelibrary; + +public @interface Before { + +} From 9e48f6c38cdef471f0393c9280461193cf1626a3 Mon Sep 17 00:00:00 2001 From: "artemy.ozerski" Date: Mon, 26 Aug 2024 18:05:44 +0300 Subject: [PATCH 04/24] isEmpty test --- .../java/com/treelibrary/Impl/BSTImpl.java | 102 ++++++++++++++++++ src/test/java/com/treelibrary/BSTTest.java | 10 +- src/test/java/com/treelibrary/Before.java | 5 - 3 files changed, 108 insertions(+), 9 deletions(-) create mode 100644 src/main/java/com/treelibrary/Impl/BSTImpl.java delete mode 100644 src/test/java/com/treelibrary/Before.java diff --git a/src/main/java/com/treelibrary/Impl/BSTImpl.java b/src/main/java/com/treelibrary/Impl/BSTImpl.java new file mode 100644 index 0000000..3c20b35 --- /dev/null +++ b/src/main/java/com/treelibrary/Impl/BSTImpl.java @@ -0,0 +1,102 @@ +package com.treelibrary.Impl; + +import java.util.function.Consumer; + +import com.treelibrary.BST; +import com.treelibrary.Node; + +public class BSTImpl implements BST{ + + private Node rootNode; + + public BSTImpl() { + rootNode = null; + } + + + + @Override + public boolean isEmpty() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'isEmpty'"); + } + + @Override + public int count() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'count'"); + } + + @Override + public Node insert(Object data) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'insert'"); + } + + @Override + public Node find(Object data) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'find'"); + } + + @Override + public Object remove(Node node) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'remove'"); + } + + @Override + public Node findMin() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'findMin'"); + } + + @Override + public Node findMax() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'findMax'"); + } + + @Override + public Node next(Node node) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'next'"); + } + + @Override + public Node prev(Node node) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'prev'"); + } + + @Override + public void traverseInOrder(Consumer action) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'traverseInOrder'"); + } + + @Override + public void traversePreOrder(Consumer action) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'traversePreOrder'"); + } + + @Override + public void traversePostOrder(Consumer action) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'traversePostOrder'"); + } + + @Override + public int height() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'height'"); + } + + @Override + public void clear() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'clear'"); + } + +} diff --git a/src/test/java/com/treelibrary/BSTTest.java b/src/test/java/com/treelibrary/BSTTest.java index 0a55dab..b1e5f20 100644 --- a/src/test/java/com/treelibrary/BSTTest.java +++ b/src/test/java/com/treelibrary/BSTTest.java @@ -4,7 +4,7 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; - +import com.treelibrary.Impl.BSTImpl; import static org.junit.jupiter.api.Assertions.*; @@ -12,14 +12,16 @@ public class BSTTest { private BST bst; - @Before + @BeforeEach public void setUp() { - // Initialize your BST implementation here, e.g., bst = new BinarySearchTree<>(); + bst = new BSTImpl<>(); } @Test public void testIsEmpty() { - // Test to check if BST is empty + assertEquals(null, bst.getRoot()); + assertEquals(0, bst.count()); + } @Test diff --git a/src/test/java/com/treelibrary/Before.java b/src/test/java/com/treelibrary/Before.java deleted file mode 100644 index 8a71066..0000000 --- a/src/test/java/com/treelibrary/Before.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.treelibrary; - -public @interface Before { - -} From a0513eeb7119e4bced247f87c6697772a0990687 Mon Sep 17 00:00:00 2001 From: "artemy.ozerski" Date: Mon, 26 Aug 2024 18:39:08 +0300 Subject: [PATCH 05/24] insert test --- .../java/com/treelibrary/Impl/BSTImpl.java | 47 ++++++++++++++++--- src/test/java/com/treelibrary/BSTTest.java | 7 +-- 2 files changed, 44 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/treelibrary/Impl/BSTImpl.java b/src/main/java/com/treelibrary/Impl/BSTImpl.java index 3c20b35..5b82845 100644 --- a/src/main/java/com/treelibrary/Impl/BSTImpl.java +++ b/src/main/java/com/treelibrary/Impl/BSTImpl.java @@ -4,6 +4,8 @@ import com.treelibrary.BST; import com.treelibrary.Node; +import com.treelibrary.Impl.NodeImpl; + public class BSTImpl implements BST{ @@ -17,20 +19,51 @@ public BSTImpl() { @Override public boolean isEmpty() { - // TODO Auto-generated method stub - throw new UnsupportedOperationException("Unimplemented method 'isEmpty'"); + return (null == getRoot()); + } + + private Node getRoot() { + return rootNode; } @Override public int count() { - // TODO Auto-generated method stub - throw new UnsupportedOperationException("Unimplemented method 'count'"); + int count = 0; + + nodeCounter(count, this.getRoot()); + + return count; + } + private void nodeCounter(int count, Node node) { + + if (null == node) { + return; + } + + count += 1; + nodeCounter(count, node.getLeft()); + nodeCounter(count, node.getRight()); + } @Override - public Node insert(Object data) { - // TODO Auto-generated method stub - throw new UnsupportedOperationException("Unimplemented method 'insert'"); + public Node insert(T data) { + + Node node = new NodeImpl(data); + + if ( rootNode == null) { + rootNode = node; + } + + Node iterator = rootNode; + + while ( null != iterator) { + + + } + + + return node; } @Override diff --git a/src/test/java/com/treelibrary/BSTTest.java b/src/test/java/com/treelibrary/BSTTest.java index b1e5f20..db08597 100644 --- a/src/test/java/com/treelibrary/BSTTest.java +++ b/src/test/java/com/treelibrary/BSTTest.java @@ -19,19 +19,20 @@ public void setUp() { @Test public void testIsEmpty() { - assertEquals(null, bst.getRoot()); + assertEquals(true, bst.isEmpty()); assertEquals(0, bst.count()); } @Test public void testInsert() { - // Test to insert elements and validate structure + Node node1 = bst.insert(7); + assertEquals(node1.getData(), 7); } @Test public void testCount() { - // Test to count the number of elements in the BST + assertEquals(true, bst.isEmpty()); } @Test From 62e76f9c5210193c6557dc9f88f8745beb8dfcdc Mon Sep 17 00:00:00 2001 From: "artemy.ozerski" Date: Mon, 26 Aug 2024 19:50:47 +0300 Subject: [PATCH 06/24] insert test passed --- .../java/com/treelibrary/Impl/BSTImpl.java | 97 ++++++++++++++++--- src/test/java/com/treelibrary/BSTTest.java | 17 +++- 2 files changed, 98 insertions(+), 16 deletions(-) diff --git a/src/main/java/com/treelibrary/Impl/BSTImpl.java b/src/main/java/com/treelibrary/Impl/BSTImpl.java index 5b82845..f8f4147 100644 --- a/src/main/java/com/treelibrary/Impl/BSTImpl.java +++ b/src/main/java/com/treelibrary/Impl/BSTImpl.java @@ -7,7 +7,7 @@ import com.treelibrary.Impl.NodeImpl; -public class BSTImpl implements BST{ +public class BSTImpl> implements BST { private Node rootNode; @@ -49,55 +49,124 @@ private void nodeCounter(int count, Node node) { @Override public Node insert(T data) { - Node node = new NodeImpl(data); + Node newNode = new NodeImpl(data); if ( rootNode == null) { - rootNode = node; + + rootNode = newNode; + return rootNode; + } Node iterator = rootNode; while ( null != iterator) { - + + if (data.compareTo(iterator.getData()) < 0) { + + if (null == iterator.getLeft()) { + + iterator.setLeft(newNode); + return newNode; + + } + + iterator = iterator.getLeft(); + + } + if (data.compareTo(iterator.getData()) > 0) { + + if (null == iterator.getRight()) { + + iterator.setRight(newNode); + return newNode; + + } + + iterator = iterator.getRight(); + + } } - - return node; + return newNode; } @Override - public Node find(Object data) { - // TODO Auto-generated method stub - throw new UnsupportedOperationException("Unimplemented method 'find'"); + public Node find(T data) { + + Node iterator = rootNode; + + while (null != iterator) { + + if (data.compareTo(iterator.getData()) == 0) { + + return iterator; + + } + + if (data.compareTo(iterator.getData()) < 0) { + + iterator = iterator.getLeft(); + + } + if (data.compareTo(iterator.getData()) > 0) { + + iterator = iterator.getRight(); + + } + } + return null; + } + @Override + public String toString() { + + //StringBuilder objectString = new StringBuilder("|"); + Node iterator = this.getRoot(); + recursiveToString(iterator); + return "Recursive"; + + } + + private void recursiveToString(Node node) { + + if (null == node) { + return; + } + + System.out.println(node.getData()); + recursiveToString(node.getLeft()); + recursiveToString(node.getRight()); + } + @Override - public Object remove(Node node) { + public T remove(Node node) { // TODO Auto-generated method stub throw new UnsupportedOperationException("Unimplemented method 'remove'"); } @Override - public Node findMin() { + public Node findMin() { // TODO Auto-generated method stub throw new UnsupportedOperationException("Unimplemented method 'findMin'"); } @Override - public Node findMax() { + public Node findMax() { // TODO Auto-generated method stub throw new UnsupportedOperationException("Unimplemented method 'findMax'"); } @Override - public Node next(Node node) { + public Node next(Node node) { // TODO Auto-generated method stub throw new UnsupportedOperationException("Unimplemented method 'next'"); } @Override - public Node prev(Node node) { + public Node prev(Node node) { // TODO Auto-generated method stub throw new UnsupportedOperationException("Unimplemented method 'prev'"); } diff --git a/src/test/java/com/treelibrary/BSTTest.java b/src/test/java/com/treelibrary/BSTTest.java index db08597..1df2757 100644 --- a/src/test/java/com/treelibrary/BSTTest.java +++ b/src/test/java/com/treelibrary/BSTTest.java @@ -26,8 +26,21 @@ public void testIsEmpty() { @Test public void testInsert() { - Node node1 = bst.insert(7); - assertEquals(node1.getData(), 7); + Node node7 = bst.insert(7); + assertEquals(node7.getData(), 7); + Node node8 = bst.insert(8); + Node node9 = bst.insert(9); + Node node2 = bst.insert(2); + System.out.print(bst.toString()); + assertEquals(node7.getRight(), node8); + assertEquals(node7.getLeft(), node2); + assertEquals(node8.getLeft(), null); + assertEquals(node8.getRight(), node9); + + + //assertEquals(bst.count(), 4); + + } @Test From a1404d77e1836b2718550bc1abf0e26a97df77ef Mon Sep 17 00:00:00 2001 From: "artemy.ozerski" Date: Mon, 26 Aug 2024 20:25:57 +0300 Subject: [PATCH 07/24] insert test passed, count created and tested --- src/main/java/com/treelibrary/Impl/BSTImpl.java | 12 +++++------- src/test/java/com/treelibrary/BSTTest.java | 8 +++++++- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/treelibrary/Impl/BSTImpl.java b/src/main/java/com/treelibrary/Impl/BSTImpl.java index f8f4147..746be2c 100644 --- a/src/main/java/com/treelibrary/Impl/BSTImpl.java +++ b/src/main/java/com/treelibrary/Impl/BSTImpl.java @@ -29,20 +29,18 @@ private Node getRoot() { @Override public int count() { int count = 0; - - nodeCounter(count, this.getRoot()); + Node iter = this.getRoot(); + count = nodeCounter( iter); return count; } - private void nodeCounter(int count, Node node) { + private int nodeCounter(Node node) { if (null == node) { - return; + return 0; } - count += 1; - nodeCounter(count, node.getLeft()); - nodeCounter(count, node.getRight()); + return 1 + nodeCounter( node.getLeft()) + nodeCounter(node.getRight()); } diff --git a/src/test/java/com/treelibrary/BSTTest.java b/src/test/java/com/treelibrary/BSTTest.java index 1df2757..085e328 100644 --- a/src/test/java/com/treelibrary/BSTTest.java +++ b/src/test/java/com/treelibrary/BSTTest.java @@ -28,8 +28,14 @@ public void testIsEmpty() { public void testInsert() { Node node7 = bst.insert(7); assertEquals(node7.getData(), 7); + assertEquals(bst.count(), 1); + Node node8 = bst.insert(8); + assertEquals(bst.count(), 2); + Node node9 = bst.insert(9); + assertEquals(bst.count(), 3); + Node node2 = bst.insert(2); System.out.print(bst.toString()); assertEquals(node7.getRight(), node8); @@ -38,7 +44,7 @@ public void testInsert() { assertEquals(node8.getRight(), node9); - //assertEquals(bst.count(), 4); + assertEquals(bst.count(), 4); } From 2a3ff278d3d81deeda3ecddeb90ad98cd434a60f Mon Sep 17 00:00:00 2001 From: "artemy.ozerski" Date: Mon, 26 Aug 2024 20:41:13 +0300 Subject: [PATCH 08/24] remove failing test --- src/main/java/com/treelibrary/BST.java | 1 + src/main/java/com/treelibrary/Impl/BSTImpl.java | 16 ++++++++-------- src/test/java/com/treelibrary/BSTTest.java | 4 +--- 3 files changed, 10 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/treelibrary/BST.java b/src/main/java/com/treelibrary/BST.java index a0a4115..7c7bf56 100644 --- a/src/main/java/com/treelibrary/BST.java +++ b/src/main/java/com/treelibrary/BST.java @@ -4,6 +4,7 @@ public interface BST { + public Node getRoot(); boolean isEmpty(); int count(); Node insert(T data); diff --git a/src/main/java/com/treelibrary/Impl/BSTImpl.java b/src/main/java/com/treelibrary/Impl/BSTImpl.java index 746be2c..500adcf 100644 --- a/src/main/java/com/treelibrary/Impl/BSTImpl.java +++ b/src/main/java/com/treelibrary/Impl/BSTImpl.java @@ -22,7 +22,7 @@ public boolean isEmpty() { return (null == getRoot()); } - private Node getRoot() { + public Node getRoot() { return rootNode; } @@ -119,22 +119,22 @@ public Node find(T data) { @Override public String toString() { - //StringBuilder objectString = new StringBuilder("|"); + StringBuilder objectString = new StringBuilder("|"); Node iterator = this.getRoot(); - recursiveToString(iterator); - return "Recursive"; + recursiveToString(iterator, objectString); + return objectString.toString(); } - private void recursiveToString(Node node) { + private void recursiveToString(Node node, StringBuilder objectString) { if (null == node) { return; } - System.out.println(node.getData()); - recursiveToString(node.getLeft()); - recursiveToString(node.getRight()); + objectString.append(node.getData().toString()); + recursiveToString(node.getLeft(), objectString); + recursiveToString(node.getRight(), objectString); } diff --git a/src/test/java/com/treelibrary/BSTTest.java b/src/test/java/com/treelibrary/BSTTest.java index 085e328..316da40 100644 --- a/src/test/java/com/treelibrary/BSTTest.java +++ b/src/test/java/com/treelibrary/BSTTest.java @@ -43,10 +43,8 @@ public void testInsert() { assertEquals(node8.getLeft(), null); assertEquals(node8.getRight(), node9); - assertEquals(bst.count(), 4); - } @Test @@ -61,7 +59,7 @@ public void testFind() { @Test public void testRemove() { - // Test to remove elements from the BST and validate the structure + bst.remove(bst.getRoot()); } @Test From a9859880250b8fed17baa696db84ce67de782957 Mon Sep 17 00:00:00 2001 From: "artemy.ozerski" Date: Tue, 27 Aug 2024 10:48:51 +0300 Subject: [PATCH 09/24] remove successful first test --- src/main/java/com/treelibrary/Impl/BSTImpl.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/treelibrary/Impl/BSTImpl.java b/src/main/java/com/treelibrary/Impl/BSTImpl.java index 500adcf..26fd27e 100644 --- a/src/main/java/com/treelibrary/Impl/BSTImpl.java +++ b/src/main/java/com/treelibrary/Impl/BSTImpl.java @@ -141,8 +141,12 @@ private void recursiveToString(Node node, StringBuilder objectString) { @Override public T remove(Node node) { - // TODO Auto-generated method stub - throw new UnsupportedOperationException("Unimplemented method 'remove'"); + + if (null == rootNode) { + return null; + } + + return node.getData(); } @Override From d9404d9f643d5bfcdacac86ae341e6599ae2a688 Mon Sep 17 00:00:00 2001 From: "artemy.ozerski" Date: Tue, 27 Aug 2024 12:44:57 +0300 Subject: [PATCH 10/24] parent added & remove leaf test passed --- .../java/com/treelibrary/Impl/BSTImpl.java | 33 ++++++++++++-- .../java/com/treelibrary/Impl/NodeImpl.java | 44 +++++++++++++++++++ src/main/java/com/treelibrary/Node.java | 9 ++++ src/test/java/com/treelibrary/BSTTest.java | 38 +++++++++++++++- 4 files changed, 119 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/treelibrary/Impl/BSTImpl.java b/src/main/java/com/treelibrary/Impl/BSTImpl.java index 26fd27e..784805d 100644 --- a/src/main/java/com/treelibrary/Impl/BSTImpl.java +++ b/src/main/java/com/treelibrary/Impl/BSTImpl.java @@ -66,6 +66,7 @@ public Node insert(T data) { if (null == iterator.getLeft()) { iterator.setLeft(newNode); + newNode.setParent(iterator); return newNode; } @@ -78,6 +79,7 @@ public Node insert(T data) { if (null == iterator.getRight()) { iterator.setRight(newNode); + newNode.setParent(iterator); return newNode; } @@ -142,13 +144,38 @@ private void recursiveToString(Node node, StringBuilder objectString) { @Override public T remove(Node node) { - if (null == rootNode) { + if (null == node) { return null; - } + } + + T data = node.getData(); + + if (node.isLeaf()) { + + if (node.isLeftChild()) { + + node.getParent().setLeft(null); + + } + else if (node.isRightChild()) { + + node.getParent().setRight(null); - return node.getData(); + } + else {//root + rootNode = null; + + } + + return data; + } + + return null; } + + + @Override public Node findMin() { // TODO Auto-generated method stub diff --git a/src/main/java/com/treelibrary/Impl/NodeImpl.java b/src/main/java/com/treelibrary/Impl/NodeImpl.java index 8abffbc..aa73b32 100644 --- a/src/main/java/com/treelibrary/Impl/NodeImpl.java +++ b/src/main/java/com/treelibrary/Impl/NodeImpl.java @@ -5,11 +5,13 @@ public class NodeImpl implements Node { private T data; private Node left; private Node right; + private Node parent; public NodeImpl(T data) { this.data = data; this.left = null; this.right = null; + this.parent = null; } @Override @@ -41,4 +43,46 @@ public Node getRight() { public void setRight(Node right) { this.right = right; } + + public boolean isLeaf() { + + return (!hasLeftChild()) && (!hasRightChild()); + + } + public boolean hasRightChild() { + + return null != this.getRight(); + + } + public boolean hasLeftChild() { + + return null != this.getLeft(); + + } + + @Override + public Node getParent() { + return parent; + } + + @Override + public void setParent(Node node) { + + this.parent = node; + + } + + @Override + public boolean isLeftChild() { + + return (null != parent) && (parent.getLeft() == this); + + } + + @Override + public boolean isRightChild() { + + return (null != parent) && (parent.getRight() == this); + + } } diff --git a/src/main/java/com/treelibrary/Node.java b/src/main/java/com/treelibrary/Node.java index 0cc7cc3..4af95ff 100644 --- a/src/main/java/com/treelibrary/Node.java +++ b/src/main/java/com/treelibrary/Node.java @@ -9,4 +9,13 @@ public interface Node { Node getRight(); void setRight(Node right); + + Node getParent(); + void setParent(Node node); + + boolean isLeaf(); + boolean isLeftChild(); + boolean isRightChild(); + boolean hasRightChild(); + boolean hasLeftChild(); } diff --git a/src/test/java/com/treelibrary/BSTTest.java b/src/test/java/com/treelibrary/BSTTest.java index 316da40..52b2d0e 100644 --- a/src/test/java/com/treelibrary/BSTTest.java +++ b/src/test/java/com/treelibrary/BSTTest.java @@ -58,8 +58,42 @@ public void testFind() { } @Test - public void testRemove() { - bst.remove(bst.getRoot()); + public void testRemoveEmpty() { + + assertEquals(null, bst.remove(bst.getRoot())); + } + @Test + public void testRemoveLeaf() { + Node node8 = bst.insert(8); + assertEquals(bst.count(), 1); + assertEquals(8, bst.remove(node8)); + assertEquals(bst.count(), 0); + Node node17 = bst.insert(17); + Node node4 = bst.insert(4); + Node node3 = bst.insert(3); + + assertEquals(3, bst.remove(node3)); + assertEquals(4, bst.remove(node4)); + + assertEquals(bst.count(), 1); + + + + + + + + + + + } + @Test + public void testRemoveOneChild() { + + } + @Test + public void testRemove2Children() { + } @Test From d543b4c127b9e060c56078a87b916f54787cbe25 Mon Sep 17 00:00:00 2001 From: "artemy.ozerski" Date: Tue, 27 Aug 2024 13:20:15 +0300 Subject: [PATCH 11/24] remove one child case passed --- src/main/java/com/treelibrary/Impl/BSTImpl.java | 10 ++++++++++ .../java/com/treelibrary/Impl/NodeImpl.java | 6 ++++++ src/main/java/com/treelibrary/Node.java | 2 ++ src/test/java/com/treelibrary/BSTTest.java | 17 +++++++---------- 4 files changed, 25 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/treelibrary/Impl/BSTImpl.java b/src/main/java/com/treelibrary/Impl/BSTImpl.java index 784805d..f03cec5 100644 --- a/src/main/java/com/treelibrary/Impl/BSTImpl.java +++ b/src/main/java/com/treelibrary/Impl/BSTImpl.java @@ -169,6 +169,16 @@ else if (node.isRightChild()) { return data; } + if (node.hasOneChild() && node.hasRightChild()) { + node.getParent().setRight(node.getRight()); + node.getRight().setParent(node.getParent()); + return data; + } + if (node.hasOneChild() && node.hasLeftChild()) { + node.getParent().setLeft(node.getLeft()); + node.getLeft().setParent(node.getParent()); + return data; + } return null; } diff --git a/src/main/java/com/treelibrary/Impl/NodeImpl.java b/src/main/java/com/treelibrary/Impl/NodeImpl.java index aa73b32..d3beec3 100644 --- a/src/main/java/com/treelibrary/Impl/NodeImpl.java +++ b/src/main/java/com/treelibrary/Impl/NodeImpl.java @@ -60,6 +60,12 @@ public boolean hasLeftChild() { } + public boolean hasOneChild() { + + return (this.hasRightChild() && !this.hasLeftChild()) || this.hasLeftChild() && !this.hasRightChild(); + + } + @Override public Node getParent() { return parent; diff --git a/src/main/java/com/treelibrary/Node.java b/src/main/java/com/treelibrary/Node.java index 4af95ff..2ee22dd 100644 --- a/src/main/java/com/treelibrary/Node.java +++ b/src/main/java/com/treelibrary/Node.java @@ -18,4 +18,6 @@ public interface Node { boolean isRightChild(); boolean hasRightChild(); boolean hasLeftChild(); + public boolean hasOneChild(); + } diff --git a/src/test/java/com/treelibrary/BSTTest.java b/src/test/java/com/treelibrary/BSTTest.java index 52b2d0e..5f05ea1 100644 --- a/src/test/java/com/treelibrary/BSTTest.java +++ b/src/test/java/com/treelibrary/BSTTest.java @@ -76,20 +76,17 @@ public void testRemoveLeaf() { assertEquals(4, bst.remove(node4)); assertEquals(bst.count(), 1); + } - - - - - - - - - } @Test public void testRemoveOneChild() { - + Node node17 = bst.insert(17); + Node node4 = bst.insert(4); + Node node3 = bst.insert(3); + assertEquals(4, bst.remove(node4)); + + } @Test public void testRemove2Children() { From 5174479a919b2da7f8b1c677cc4c0b1479381e4b Mon Sep 17 00:00:00 2001 From: "artemy.ozerski" Date: Tue, 27 Aug 2024 13:50:56 +0300 Subject: [PATCH 12/24] next test fails --- src/main/java/com/treelibrary/BST.java | 4 +-- .../java/com/treelibrary/Impl/BSTImpl.java | 36 +++++++++++++------ src/test/java/com/treelibrary/BSTTest.java | 12 ++++++- 3 files changed, 39 insertions(+), 13 deletions(-) diff --git a/src/main/java/com/treelibrary/BST.java b/src/main/java/com/treelibrary/BST.java index 7c7bf56..bfc41c7 100644 --- a/src/main/java/com/treelibrary/BST.java +++ b/src/main/java/com/treelibrary/BST.java @@ -10,8 +10,8 @@ public interface BST { Node insert(T data); Node find(T data); T remove(Node node); - Node findMin(); - Node findMax(); + Node findMin(Node root); + Node findMax(Node root); Node next(Node node); Node prev(Node node); diff --git a/src/main/java/com/treelibrary/Impl/BSTImpl.java b/src/main/java/com/treelibrary/Impl/BSTImpl.java index f03cec5..a1c240d 100644 --- a/src/main/java/com/treelibrary/Impl/BSTImpl.java +++ b/src/main/java/com/treelibrary/Impl/BSTImpl.java @@ -187,25 +187,41 @@ else if (node.isRightChild()) { @Override - public Node findMin() { - // TODO Auto-generated method stub - throw new UnsupportedOperationException("Unimplemented method 'findMin'"); + public Node findMin(Node root) { + + Node iterator = root; + + while (iterator != null) { + + iterator = iterator.getLeft(); + + } + + return iterator; } @Override - public Node findMax() { - // TODO Auto-generated method stub - throw new UnsupportedOperationException("Unimplemented method 'findMax'"); + public Node findMax(Node root) { + + Node iterator = root; + + while (iterator != null) { + + iterator = iterator.getRight(); + + } + + return iterator; + } @Override - public Node next(Node node) { - // TODO Auto-generated method stub - throw new UnsupportedOperationException("Unimplemented method 'next'"); + public Node next(Node node) {//inorder successor + return null; } @Override - public Node prev(Node node) { + public Node prev(Node node) {//predecessor // TODO Auto-generated method stub throw new UnsupportedOperationException("Unimplemented method 'prev'"); } diff --git a/src/test/java/com/treelibrary/BSTTest.java b/src/test/java/com/treelibrary/BSTTest.java index 5f05ea1..d4fa870 100644 --- a/src/test/java/com/treelibrary/BSTTest.java +++ b/src/test/java/com/treelibrary/BSTTest.java @@ -105,7 +105,17 @@ public void testFindMax() { @Test public void testNext() { - // Test to find the in-order successor of a given node + + Node node20 = bst.insert(20); + Node node22 = bst.insert(22); + Node node8 = bst.insert(8); + Node node12 = bst.insert(12); + Node node10 = bst.insert(10); + Node node14 = bst.insert(14); + Node node4 = bst.insert(4); + + assertEquals(bst.next(node12), node14); + } @Test From 2b14490c15e49ef2e733a6c1a8b0da78cc57ba5b Mon Sep 17 00:00:00 2001 From: "artemy.ozerski" Date: Tue, 27 Aug 2024 15:03:54 +0300 Subject: [PATCH 13/24] next test passed --- .../java/com/treelibrary/Impl/BSTImpl.java | 24 ++++++++++++++++--- src/test/java/com/treelibrary/BSTTest.java | 6 +++++ 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/treelibrary/Impl/BSTImpl.java b/src/main/java/com/treelibrary/Impl/BSTImpl.java index a1c240d..a213582 100644 --- a/src/main/java/com/treelibrary/Impl/BSTImpl.java +++ b/src/main/java/com/treelibrary/Impl/BSTImpl.java @@ -134,7 +134,7 @@ private void recursiveToString(Node node, StringBuilder objectString) { return; } - objectString.append(node.getData().toString()); + objectString.append(" " + node.getData().toString()); recursiveToString(node.getLeft(), objectString); recursiveToString(node.getRight(), objectString); @@ -188,10 +188,14 @@ else if (node.isRightChild()) { @Override public Node findMin(Node root) { + + if (root == null) { + return null; + } Node iterator = root; - while (iterator != null) { + while (iterator.getLeft() != null) { iterator = iterator.getLeft(); @@ -217,7 +221,21 @@ public Node findMax(Node root) { @Override public Node next(Node node) {//inorder successor - return null; + + Node successor = null; + + if(node.hasRightChild()) { + successor = findMin(node.getRight()); + } + else if (findMax(rootNode) == node ) { + successor = null; + } + else { + + } + + + return successor; } @Override diff --git a/src/test/java/com/treelibrary/BSTTest.java b/src/test/java/com/treelibrary/BSTTest.java index d4fa870..f10ea1b 100644 --- a/src/test/java/com/treelibrary/BSTTest.java +++ b/src/test/java/com/treelibrary/BSTTest.java @@ -114,7 +114,13 @@ public void testNext() { Node node14 = bst.insert(14); Node node4 = bst.insert(4); + System.out.println(bst.toString()); + assertEquals(bst.next(node12), node14); + assertEquals(bst.next(node22), null); + assertEquals(bst.next(node8), node10); + assertEquals(bst.next(node20), node22); + } From a5d5a5ccab955bcc03fc79deb3472b90807af7c0 Mon Sep 17 00:00:00 2001 From: "artemy.ozerski" Date: Wed, 28 Aug 2024 07:12:36 +0300 Subject: [PATCH 14/24] next test passed in all 3 cases --- .../java/com/treelibrary/Impl/BSTImpl.java | 29 ++++++++++++++++--- src/test/java/com/treelibrary/BSTTest.java | 5 +++- 2 files changed, 29 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/treelibrary/Impl/BSTImpl.java b/src/main/java/com/treelibrary/Impl/BSTImpl.java index a213582..95b86bc 100644 --- a/src/main/java/com/treelibrary/Impl/BSTImpl.java +++ b/src/main/java/com/treelibrary/Impl/BSTImpl.java @@ -188,7 +188,7 @@ else if (node.isRightChild()) { @Override public Node findMin(Node root) { - + if (root == null) { return null; } @@ -206,10 +206,14 @@ public Node findMin(Node root) { @Override public Node findMax(Node root) { - + + if (root == null) { + return null; + } + Node iterator = root; - while (iterator != null) { + while (iterator.getRight() != null) { iterator = iterator.getRight(); @@ -225,15 +229,32 @@ public Node next(Node node) {//inorder successor Node successor = null; if(node.hasRightChild()) { + successor = findMin(node.getRight()); + } else if (findMax(rootNode) == node ) { + successor = null; + } else { - } + Node iterator = node; + + while (iterator.getParent() != null) { + + if(iterator.getParent().getLeft() == iterator) {//if current node is a left child + + successor = iterator.getParent(); + + } + iterator = iterator.getParent(); + + } + + } return successor; } diff --git a/src/test/java/com/treelibrary/BSTTest.java b/src/test/java/com/treelibrary/BSTTest.java index f10ea1b..4994677 100644 --- a/src/test/java/com/treelibrary/BSTTest.java +++ b/src/test/java/com/treelibrary/BSTTest.java @@ -117,11 +117,14 @@ public void testNext() { System.out.println(bst.toString()); assertEquals(bst.next(node12), node14); + //highest value in a tree assertEquals(bst.next(node22), null); + assertEquals(bst.next(node8), node10); assertEquals(bst.next(node20), node22); - + //no right tree, going up with the parent + assertEquals(bst.next(node14), node20); } @Test From 814c0f9334d207fa5a3edd77a89e02e159e30e36 Mon Sep 17 00:00:00 2001 From: "artemy.ozerski" Date: Wed, 28 Aug 2024 07:13:38 +0300 Subject: [PATCH 15/24] small fix --- src/main/java/com/treelibrary/Impl/BSTImpl.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/com/treelibrary/Impl/BSTImpl.java b/src/main/java/com/treelibrary/Impl/BSTImpl.java index 95b86bc..4a8da41 100644 --- a/src/main/java/com/treelibrary/Impl/BSTImpl.java +++ b/src/main/java/com/treelibrary/Impl/BSTImpl.java @@ -4,7 +4,6 @@ import com.treelibrary.BST; import com.treelibrary.Node; -import com.treelibrary.Impl.NodeImpl; public class BSTImpl> implements BST { @@ -247,7 +246,7 @@ else if (findMax(rootNode) == node ) { if(iterator.getParent().getLeft() == iterator) {//if current node is a left child successor = iterator.getParent(); - + } iterator = iterator.getParent(); From 00fd6645bc04e5ff77d511dce67fac196db26ae3 Mon Sep 17 00:00:00 2001 From: "artemy.ozerski" Date: Sun, 8 Sep 2024 16:58:27 +0300 Subject: [PATCH 16/24] fixing remove in bst --- src/main/java/com/treelibrary/Impl/BSTImpl.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/treelibrary/Impl/BSTImpl.java b/src/main/java/com/treelibrary/Impl/BSTImpl.java index 4a8da41..afd2b39 100644 --- a/src/main/java/com/treelibrary/Impl/BSTImpl.java +++ b/src/main/java/com/treelibrary/Impl/BSTImpl.java @@ -29,7 +29,7 @@ public Node getRoot() { public int count() { int count = 0; Node iter = this.getRoot(); - count = nodeCounter( iter); + count = nodeCounter(iter); return count; } @@ -148,7 +148,7 @@ public T remove(Node node) { } T data = node.getData(); - + //3 cases to consider: node to delete is a leaf if (node.isLeaf()) { if (node.isLeftChild()) { @@ -163,11 +163,11 @@ else if (node.isRightChild()) { } else {//root rootNode = null; - } return data; } + // node to delete has one child if (node.hasOneChild() && node.hasRightChild()) { node.getParent().setRight(node.getRight()); node.getRight().setParent(node.getParent()); @@ -178,6 +178,8 @@ else if (node.isRightChild()) { node.getLeft().setParent(node.getParent()); return data; } + //node to delete has 2 children + return null; } From 9895336ec77dcb599b783d95e34b2354fbaeeaba Mon Sep 17 00:00:00 2001 From: "artemy.ozerski" Date: Sun, 8 Sep 2024 18:27:24 +0300 Subject: [PATCH 17/24] height added --- pom.xml | 12 +++++------ .../java/com/treelibrary/Impl/BSTImpl.java | 21 ++++++++++++++++--- src/test/java/com/treelibrary/BSTTest.java | 8 ++++++- 3 files changed, 31 insertions(+), 10 deletions(-) diff --git a/pom.xml b/pom.xml index 0a2d511..94f864a 100644 --- a/pom.xml +++ b/pom.xml @@ -1,11 +1,11 @@ 4.0.0 - com.stack.project - stack-app + com.treelib.project + treelib-app jar 1.0-SNAPSHOT - stack-app + treelib-app http://maven.apache.org @@ -28,8 +28,8 @@ maven-compiler-plugin 3.8.1 - 22 - 22 + 17 + 17 @@ -40,7 +40,7 @@ true - com.stack.project.MainClass + com.treelib.project.MainClass diff --git a/src/main/java/com/treelibrary/Impl/BSTImpl.java b/src/main/java/com/treelibrary/Impl/BSTImpl.java index afd2b39..2a945af 100644 --- a/src/main/java/com/treelibrary/Impl/BSTImpl.java +++ b/src/main/java/com/treelibrary/Impl/BSTImpl.java @@ -179,7 +179,7 @@ else if (node.isRightChild()) { return data; } //node to delete has 2 children - + return null; } @@ -286,8 +286,23 @@ public void traversePostOrder(Consumer action) { @Override public int height() { - // TODO Auto-generated method stub - throw new UnsupportedOperationException("Unimplemented method 'height'"); + if(isEmpty()) { + return -1; + } + return maxDepth(rootNode); + } + + private int maxDepth(Node node) { + + if (node == null){ + return -1; + } + + int rightDepth = maxDepth(node.getRight()); + int leftDepth = maxDepth(node.getLeft()); + + return Math.max(rightDepth, leftDepth) + 1; + } @Override diff --git a/src/test/java/com/treelibrary/BSTTest.java b/src/test/java/com/treelibrary/BSTTest.java index 4994677..87ed406 100644 --- a/src/test/java/com/treelibrary/BSTTest.java +++ b/src/test/java/com/treelibrary/BSTTest.java @@ -148,8 +148,14 @@ public void testTraversePostOrder() { } @Test + @DisplayName("Height test") public void testHeight() { - // Test to calculate the height of the BST + assertEquals(bst.height(), -1); + Node node20 = bst.insert(20); + Node node22 = bst.insert(22); + Node node8 = bst.insert(8); + Node node12 = bst.insert(12); + assertEquals(bst.height(), 2); } @Test From b12843d73839741198cffd92fa645ff53ca280fb Mon Sep 17 00:00:00 2001 From: "artemy.ozerski" Date: Mon, 9 Sep 2024 08:44:36 +0300 Subject: [PATCH 18/24] traverse/postorder/inorder/preorder/clear added --- .../java/com/treelibrary/Impl/BSTImpl.java | 63 +++++++++++++++---- 1 file changed, 52 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/treelibrary/Impl/BSTImpl.java b/src/main/java/com/treelibrary/Impl/BSTImpl.java index 2a945af..dc79035 100644 --- a/src/main/java/com/treelibrary/Impl/BSTImpl.java +++ b/src/main/java/com/treelibrary/Impl/BSTImpl.java @@ -267,23 +267,52 @@ public Node prev(Node node) {//predecessor } @Override - public void traverseInOrder(Consumer action) { - // TODO Auto-generated method stub - throw new UnsupportedOperationException("Unimplemented method 'traverseInOrder'"); + public void traverseInOrder(Consumer action) { + traverseInOrderRecursively(rootNode, action); + } + private void traverseInOrderRecursively(Node root, Consumer action){ + + if (root == null) { + return; + } + + traverseInOrderRecursively(root.getLeft(), action); + action.accept(root.getData()); + traverseInOrderRecursively(root.getRight(), action); + } @Override - public void traversePreOrder(Consumer action) { - // TODO Auto-generated method stub - throw new UnsupportedOperationException("Unimplemented method 'traversePreOrder'"); + public void traversePreOrder(Consumer action) { + traversePreOrderRecursively(rootNode, action); + } + private void traversePreOrderRecursively(Node root, Consumer action){ + + if (root == null) { + return; + } + action.accept(root.getData()); + + traversePreOrderRecursively(root.getLeft(), action); + traversePreOrderRecursively(root.getRight(), action); } @Override - public void traversePostOrder(Consumer action) { - // TODO Auto-generated method stub - throw new UnsupportedOperationException("Unimplemented method 'traversePostOrder'"); + public void traversePostOrder(Consumer action) { + traversePostOrder(rootNode, action); } + + private void traversePostOrder(Node root, Consumer action){ + + if (root == null) { + return; + } + traversePostOrder(root.getLeft(), action); + traversePostOrder(root.getRight(), action); + + action.accept(root.getData()); + } @Override public int height() { if(isEmpty()) { @@ -307,8 +336,20 @@ private int maxDepth(Node node) { @Override public void clear() { - // TODO Auto-generated method stub - throw new UnsupportedOperationException("Unimplemented method 'clear'"); + //because java has garbage collector we could just use rootNode = null; + clearTree(rootNode); } + private void clearTree(Node root) { + if (root == null) { + return; + } + + clearTree(root.getLeft()); + clearTree(root.getRight()); + + root.setLeft(null); + root.setRight(null); + root.setData(null); + } } From 0aad41d6763ff02626ef3d859e88d42ca46f6dcf Mon Sep 17 00:00:00 2001 From: "artemy.ozerski" Date: Mon, 9 Sep 2024 10:15:27 +0300 Subject: [PATCH 19/24] remove fixed --- .../java/com/treelibrary/Impl/BSTImpl.java | 59 ++++++++++++------- 1 file changed, 37 insertions(+), 22 deletions(-) diff --git a/src/main/java/com/treelibrary/Impl/BSTImpl.java b/src/main/java/com/treelibrary/Impl/BSTImpl.java index dc79035..6435101 100644 --- a/src/main/java/com/treelibrary/Impl/BSTImpl.java +++ b/src/main/java/com/treelibrary/Impl/BSTImpl.java @@ -169,19 +169,42 @@ else if (node.isRightChild()) { } // node to delete has one child if (node.hasOneChild() && node.hasRightChild()) { - node.getParent().setRight(node.getRight()); + + if (node.isLeftChild()) { + node.getParent().setLeft(node.getRight()); + } else if (node.isRightChild()) { + node.getParent().setRight(node.getRight()); + } else { // Node is the root + rootNode = node.getRight(); + } + node.getRight().setParent(node.getParent()); + return data; } if (node.hasOneChild() && node.hasLeftChild()) { - node.getParent().setLeft(node.getLeft()); + if (node.isLeftChild()) { + node.getParent().setLeft(node.getLeft()); + } else if (node.isRightChild()) { + node.getParent().setRight(node.getLeft()); + } else { // Node is the root + rootNode = node.getLeft(); + } node.getLeft().setParent(node.getParent()); return data; } //node to delete has 2 children + if (node.hasLeftChild() && node.hasRightChild()) { + + Node successor = next(node); + + node.setData(successor.getData()); + + remove(successor); + } - return null; + return data; } @@ -231,33 +254,27 @@ public Node next(Node node) {//inorder successor if(node.hasRightChild()) { - successor = findMin(node.getRight()); + return findMin(node.getRight()); } - else if (findMax(rootNode) == node ) { + //if node is maximum int the tree + if (findMax(rootNode) == node ) { - successor = null; + return null; } - else { - + Node iterator = node; + Node iteratorParent = node.getParent(); + //find node that is a left child of its parent, the parent is a successor + while (iteratorParent != null && iterator == iteratorParent.getRight()) { - while (iterator.getParent() != null) { - - if(iterator.getParent().getLeft() == iterator) {//if current node is a left child - - successor = iterator.getParent(); - - } - - iterator = iterator.getParent(); + iterator = iteratorParent; + iteratorParent = iterator.getParent(); } - } - - return successor; + return iteratorParent; } @Override @@ -279,7 +296,6 @@ private void traverseInOrderRecursively(Node root, Consumer action){ traverseInOrderRecursively(root.getLeft(), action); action.accept(root.getData()); traverseInOrderRecursively(root.getRight(), action); - } @Override @@ -331,7 +347,6 @@ private int maxDepth(Node node) { int leftDepth = maxDepth(node.getLeft()); return Math.max(rightDepth, leftDepth) + 1; - } @Override From 029555dbeab214e5d437b3949a60305158827f4b Mon Sep 17 00:00:00 2001 From: "artemy.ozerski" Date: Mon, 9 Sep 2024 11:03:44 +0300 Subject: [PATCH 20/24] bug detected in removal of 2 children --- .../java/com/treelibrary/Impl/BSTImpl.java | 19 ++++++- src/test/java/com/treelibrary/BSTTest.java | 56 ++++++++++++++++++- 2 files changed, 70 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/treelibrary/Impl/BSTImpl.java b/src/main/java/com/treelibrary/Impl/BSTImpl.java index 6435101..250350f 100644 --- a/src/main/java/com/treelibrary/Impl/BSTImpl.java +++ b/src/main/java/com/treelibrary/Impl/BSTImpl.java @@ -196,14 +196,27 @@ else if (node.isRightChild()) { //node to delete has 2 children if (node.hasLeftChild() && node.hasRightChild()) { - Node successor = next(node); + Node successor = findMin(node.getRight()); + // Set the data of the node to be removed with the successor's data node.setData(successor.getData()); - remove(successor); + // Special case: If the in-order successor is the direct child of the node + if (successor.getParent() == node) { + node.setRight(successor.getRight()); + if (successor.getRight() != null) { + successor.getRight().setParent(node); + } + } else { + // Remove the in-order successor + if (successor.getRight() != null) { + successor.getRight().setParent(successor.getParent()); + } + successor.getParent().setLeft(successor.getRight()); + } + return data; } - return data; } diff --git a/src/test/java/com/treelibrary/BSTTest.java b/src/test/java/com/treelibrary/BSTTest.java index 87ed406..3c9639b 100644 --- a/src/test/java/com/treelibrary/BSTTest.java +++ b/src/test/java/com/treelibrary/BSTTest.java @@ -90,8 +90,60 @@ public void testRemoveOneChild() { } @Test public void testRemove2Children() { - - } + // Inserting nodes + Node node17 = bst.insert(17); + Node node4 = bst.insert(4); + Node node20 = bst.insert(20); + Node node3 = bst.insert(3); + Node node9 = bst.insert(9); + Node node7 = bst.insert(7); + Node node8 = bst.insert(8); + + assertEquals(4, node17.getLeft().getData()); + assertEquals(20, node17.getRight().getData()); + assertEquals(3, node4.getLeft().getData()); + assertEquals(9, node4.getRight().getData()); + assertEquals(7, node9.getLeft().getData()); + assertEquals(8, node7.getRight().getData()); + + + // Before removal, the structure is: + // 17 + // / \ + // 4 20 + // / \ + // 3 9 + // / + // 7 + // \ + // 8 + + // Test that node 4 is removed correctly (it has two children) + assertEquals(4, bst.remove(node4)); + + // The tree should now be: + // 17 + // / \ + // 7 20 + // / \ + // 3 9 + // / + // 8 + + // Verify the structure + assertEquals(7, node17.getLeft().getData()); // 17's left child should now be 7 + assertEquals(9, node17.getLeft().getRight().getData()); // 7's right child should be 9 + assertEquals(8, node9.getLeft().getData()); // 9's left child should still be 8 + System.out.println(" BST node removal" + bst.toString()) ; + assertEquals(7, node7.getData()); + System.out.println("node7: " + (node7.getLeft()).getData()); + assertEquals(3, node7.getLeft().getData()); // 7's left child should be 3 + + // Verify that node 7 and 9 are correctly connected to their parents + assertEquals(node17, node7.getParent()); // 7 should have 17 as parent + assertEquals(node7, node9.getParent()); // 9 should have 7 as parent + assertEquals(node9, node8.getParent()); // 8 should have 9 as parent + } @Test public void testFindMin() { From 05430aff85d69b366045eff6b5e20f19804aa0dc Mon Sep 17 00:00:00 2001 From: "artemy.ozerski" Date: Mon, 9 Sep 2024 11:36:58 +0300 Subject: [PATCH 21/24] bug was in the test --- src/test/java/com/treelibrary/BSTTest.java | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/test/java/com/treelibrary/BSTTest.java b/src/test/java/com/treelibrary/BSTTest.java index 3c9639b..8462f5b 100644 --- a/src/test/java/com/treelibrary/BSTTest.java +++ b/src/test/java/com/treelibrary/BSTTest.java @@ -135,13 +135,15 @@ public void testRemove2Children() { assertEquals(9, node17.getLeft().getRight().getData()); // 7's right child should be 9 assertEquals(8, node9.getLeft().getData()); // 9's left child should still be 8 System.out.println(" BST node removal" + bst.toString()) ; - assertEquals(7, node7.getData()); - System.out.println("node7: " + (node7.getLeft()).getData()); - assertEquals(3, node7.getLeft().getData()); // 7's left child should be 3 + assertEquals(7, node17.getLeft().getData()); + assertEquals(3, node17.getLeft().getLeft().getData()); + //assertEquals(7, node7.getData()); + // System.out.println("node7: " + (node7.getLeft()).getData()); + //assertEquals(3, node7.getLeft().getData()); // 7's left child should be 3 // Verify that node 7 and 9 are correctly connected to their parents - assertEquals(node17, node7.getParent()); // 7 should have 17 as parent - assertEquals(node7, node9.getParent()); // 9 should have 7 as parent + //assertEquals(node17, node7.getParent()); // 7 should have 17 as parent + //assertEquals(node7, node9.getParent()); // 9 should have 7 as parent assertEquals(node9, node8.getParent()); // 8 should have 9 as parent } From 49cf7606623bce62e48a316fab3cc2c5fa1311c5 Mon Sep 17 00:00:00 2001 From: "artemy.ozerski" Date: Mon, 9 Sep 2024 11:58:01 +0300 Subject: [PATCH 22/24] added predecessor --- .../java/com/treelibrary/Impl/BSTImpl.java | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/treelibrary/Impl/BSTImpl.java b/src/main/java/com/treelibrary/Impl/BSTImpl.java index 250350f..b25f99b 100644 --- a/src/main/java/com/treelibrary/Impl/BSTImpl.java +++ b/src/main/java/com/treelibrary/Impl/BSTImpl.java @@ -292,8 +292,23 @@ public Node next(Node node) {//inorder successor @Override public Node prev(Node node) {//predecessor - // TODO Auto-generated method stub - throw new UnsupportedOperationException("Unimplemented method 'prev'"); + if (node == null) { + return null; + } + + if (node.hasLeftChild()){ + return findMax(node.getLeft()); + } + Node iterator = node; + Node iteratorParent = node.getParent(); + + while (iteratorParent != null && iterator == iteratorParent.getLeft()) { + + iterator = iteratorParent; + iteratorParent = iterator.getParent(); + + } + return iteratorParent; } @Override From 8baa36a7436427a083bb7c58f5cae86727ffa9f6 Mon Sep 17 00:00:00 2001 From: "artemy.ozerski" Date: Mon, 9 Sep 2024 18:45:44 +0300 Subject: [PATCH 23/24] tested inorder preorder postorder --- src/test/java/com/treelibrary/BSTTest.java | 70 ++++++++++++++++++---- 1 file changed, 60 insertions(+), 10 deletions(-) diff --git a/src/test/java/com/treelibrary/BSTTest.java b/src/test/java/com/treelibrary/BSTTest.java index 8462f5b..ef6050d 100644 --- a/src/test/java/com/treelibrary/BSTTest.java +++ b/src/test/java/com/treelibrary/BSTTest.java @@ -3,6 +3,9 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; +import java.util.ArrayList; +import java.util.List; + import com.treelibrary.Impl.BSTImpl; @@ -137,13 +140,6 @@ public void testRemove2Children() { System.out.println(" BST node removal" + bst.toString()) ; assertEquals(7, node17.getLeft().getData()); assertEquals(3, node17.getLeft().getLeft().getData()); - //assertEquals(7, node7.getData()); - // System.out.println("node7: " + (node7.getLeft()).getData()); - //assertEquals(3, node7.getLeft().getData()); // 7's left child should be 3 - - // Verify that node 7 and 9 are correctly connected to their parents - //assertEquals(node17, node7.getParent()); // 7 should have 17 as parent - //assertEquals(node7, node9.getParent()); // 9 should have 7 as parent assertEquals(node9, node8.getParent()); // 8 should have 9 as parent } @@ -188,17 +184,71 @@ public void testPrev() { @Test public void testTraverseInOrder() { - // Test to traverse the BST in in-order and validate the traversal + bst.insert(10); + bst.insert(5); + bst.insert(20); + bst.insert(3); + bst.insert(7); + bst.insert(15); + bst.insert(25); + + // List to collect the output + List result = new ArrayList<>(); + + // Traverse in-order and collect results + bst.traverseInOrder(result::add); + + // Expected in-order traversal + List expected = List.of(3, 5, 7, 10, 15, 20, 25); + + // Validate the result + assertEquals(expected, result); } @Test public void testTraversePreOrder() { - // Test to traverse the BST in pre-order and validate the traversal + bst.insert(10); + bst.insert(5); + bst.insert(20); + bst.insert(3); + bst.insert(7); + bst.insert(15); + bst.insert(25); + + // List to collect the output + List result = new ArrayList<>(); + + // Traverse pre-order and collect results + bst.traversePreOrder(result::add); + + // Expected pre-order traversal + List expected = List.of(10, 5, 3, 7, 20, 15, 25); + + // Validate the result + assertEquals(expected, result); } @Test public void testTraversePostOrder() { - // Test to traverse the BST in post-order and validate the traversal + bst.insert(10); + bst.insert(5); + bst.insert(20); + bst.insert(3); + bst.insert(7); + bst.insert(15); + bst.insert(25); + + // List to collect the output + List result = new ArrayList<>(); + + // Traverse post-order and collect results + bst.traversePostOrder(result::add); + + // Expected post-order traversal + List expected = List.of(3, 7, 5, 15, 25, 20, 10); + + // Validate the result + assertEquals(expected, result); } @Test From 90d123620edfdf044f0cee726be5dbd3db0f0e63 Mon Sep 17 00:00:00 2001 From: "artemy.ozerski" Date: Mon, 9 Sep 2024 18:52:54 +0300 Subject: [PATCH 24/24] toString change --- src/main/java/com/treelibrary/Impl/BSTImpl.java | 1 + src/test/java/com/treelibrary/BSTTest.java | 9 ++------- 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/treelibrary/Impl/BSTImpl.java b/src/main/java/com/treelibrary/Impl/BSTImpl.java index b25f99b..4fba8c5 100644 --- a/src/main/java/com/treelibrary/Impl/BSTImpl.java +++ b/src/main/java/com/treelibrary/Impl/BSTImpl.java @@ -123,6 +123,7 @@ public String toString() { StringBuilder objectString = new StringBuilder("|"); Node iterator = this.getRoot(); recursiveToString(iterator, objectString); + objectString.append("|"); return objectString.toString(); } diff --git a/src/test/java/com/treelibrary/BSTTest.java b/src/test/java/com/treelibrary/BSTTest.java index ef6050d..f4ad72f 100644 --- a/src/test/java/com/treelibrary/BSTTest.java +++ b/src/test/java/com/treelibrary/BSTTest.java @@ -24,7 +24,6 @@ public void setUp() { public void testIsEmpty() { assertEquals(true, bst.isEmpty()); assertEquals(0, bst.count()); - } @Test @@ -40,14 +39,13 @@ public void testInsert() { assertEquals(bst.count(), 3); Node node2 = bst.insert(2); - System.out.print(bst.toString()); + assertEquals(node7.getRight(), node8); assertEquals(node7.getLeft(), node2); assertEquals(node8.getLeft(), null); assertEquals(node8.getRight(), node9); assertEquals(bst.count(), 4); - } @Test @@ -88,9 +86,8 @@ public void testRemoveOneChild() { Node node4 = bst.insert(4); Node node3 = bst.insert(3); assertEquals(4, bst.remove(node4)); - - } + @Test public void testRemove2Children() { // Inserting nodes @@ -137,7 +134,6 @@ public void testRemove2Children() { assertEquals(7, node17.getLeft().getData()); // 17's left child should now be 7 assertEquals(9, node17.getLeft().getRight().getData()); // 7's right child should be 9 assertEquals(8, node9.getLeft().getData()); // 9's left child should still be 8 - System.out.println(" BST node removal" + bst.toString()) ; assertEquals(7, node17.getLeft().getData()); assertEquals(3, node17.getLeft().getLeft().getData()); assertEquals(node9, node8.getParent()); // 8 should have 9 as parent @@ -164,7 +160,6 @@ public void testNext() { Node node14 = bst.insert(14); Node node4 = bst.insert(4); - System.out.println(bst.toString()); assertEquals(bst.next(node12), node14); //highest value in a tree