From 1c0ae0210ee577156374cc3bb7e8c48c42dcb5fa Mon Sep 17 00:00:00 2001 From: rikim Date: Sat, 14 Mar 2020 20:06:12 +0900 Subject: [PATCH 1/8] Add BinaryTreeNodeRemoval.java --- .../company/sample/tree/btree/BinaryTreeNodeRemoval.java | 4 ++++ .../sample/tree/btree/BinaryTreeNodeRemovalTest.java | 7 +++++++ 2 files changed, 11 insertions(+) create mode 100644 src/main/java/com/company/sample/tree/btree/BinaryTreeNodeRemoval.java create mode 100644 src/test/java/com/company/sample/tree/btree/BinaryTreeNodeRemovalTest.java diff --git a/src/main/java/com/company/sample/tree/btree/BinaryTreeNodeRemoval.java b/src/main/java/com/company/sample/tree/btree/BinaryTreeNodeRemoval.java new file mode 100644 index 0000000..e09693a --- /dev/null +++ b/src/main/java/com/company/sample/tree/btree/BinaryTreeNodeRemoval.java @@ -0,0 +1,4 @@ +package com.company.sample.tree.btree; + +public class BinaryTreeNodeRemoval { +} diff --git a/src/test/java/com/company/sample/tree/btree/BinaryTreeNodeRemovalTest.java b/src/test/java/com/company/sample/tree/btree/BinaryTreeNodeRemovalTest.java new file mode 100644 index 0000000..80babfe --- /dev/null +++ b/src/test/java/com/company/sample/tree/btree/BinaryTreeNodeRemovalTest.java @@ -0,0 +1,7 @@ +package com.company.sample.tree.btree; + +import static org.junit.jupiter.api.Assertions.*; + +class BinaryTreeNodeRemovalTest { + +} \ No newline at end of file From c501a5299f62b302575b82b9e08a4e6010cf459c Mon Sep 17 00:00:00 2001 From: rikim Date: Sat, 14 Mar 2020 20:08:51 +0900 Subject: [PATCH 2/8] Add nemericValue field with constructor --- src/main/java/com/company/sample/tree/Node.java | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/company/sample/tree/Node.java b/src/main/java/com/company/sample/tree/Node.java index 0ca88d6..6b79754 100644 --- a/src/main/java/com/company/sample/tree/Node.java +++ b/src/main/java/com/company/sample/tree/Node.java @@ -6,19 +6,27 @@ public class Node { boolean isRoot = false; + public Node(String value) { this.value = value; } - public int depth= 0; + + public int numericValue; + + public int depth = 0; public List children = new LinkedList<>(); public String value; + public Node(int numericValue) { + this.numericValue = numericValue; + } + public void addChild(Node child) { children.add(child); } - public void addChildren(Node ...values) { + public void addChildren(Node... values) { children.addAll(Arrays.asList(values)); } } From 0c21da49e4486b321413ee3e5d457793e704a538 Mon Sep 17 00:00:00 2001 From: rikim Date: Sat, 14 Mar 2020 20:11:10 +0900 Subject: [PATCH 3/8] Add missing public visible to isRoot in Node.java --- src/main/java/com/company/sample/tree/Node.java | 2 +- .../sample/tree/btree/BinaryTreeNodeRemovalTest.java | 9 ++++++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/company/sample/tree/Node.java b/src/main/java/com/company/sample/tree/Node.java index 6b79754..21b5bdf 100644 --- a/src/main/java/com/company/sample/tree/Node.java +++ b/src/main/java/com/company/sample/tree/Node.java @@ -5,7 +5,7 @@ import java.util.List; public class Node { - boolean isRoot = false; + public boolean isRoot = false; public Node(String value) { this.value = value; diff --git a/src/test/java/com/company/sample/tree/btree/BinaryTreeNodeRemovalTest.java b/src/test/java/com/company/sample/tree/btree/BinaryTreeNodeRemovalTest.java index 80babfe..69f5852 100644 --- a/src/test/java/com/company/sample/tree/btree/BinaryTreeNodeRemovalTest.java +++ b/src/test/java/com/company/sample/tree/btree/BinaryTreeNodeRemovalTest.java @@ -1,7 +1,14 @@ package com.company.sample.tree.btree; -import static org.junit.jupiter.api.Assertions.*; +import com.company.sample.tree.Node; +import org.junit.Before; class BinaryTreeNodeRemovalTest { + @Before + public void buildFullBinarySearchTree() { + //Root level + Node root = new Node(31); + root.isRoot = true; + } } \ No newline at end of file From 9c7be210850d21e3c882d5ac267206a9b63a2068 Mon Sep 17 00:00:00 2001 From: rikim Date: Sat, 14 Mar 2020 20:18:26 +0900 Subject: [PATCH 4/8] Add leftChild and rightChild field to Node to support Btree structure --- src/main/java/com/company/sample/tree/Node.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/com/company/sample/tree/Node.java b/src/main/java/com/company/sample/tree/Node.java index 21b5bdf..62535fd 100644 --- a/src/main/java/com/company/sample/tree/Node.java +++ b/src/main/java/com/company/sample/tree/Node.java @@ -16,6 +16,8 @@ public Node(String value) { public int depth = 0; public List children = new LinkedList<>(); + public Node leftChild; + public Node rightChild; public String value; public Node(int numericValue) { From be00743c897cc0c134af81b742ff83ffe5ff7256 Mon Sep 17 00:00:00 2001 From: rikim Date: Sat, 14 Mar 2020 20:18:49 +0900 Subject: [PATCH 5/8] Add pre-built tree in test class --- .../tree/btree/BinaryTreeNodeRemovalTest.java | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/src/test/java/com/company/sample/tree/btree/BinaryTreeNodeRemovalTest.java b/src/test/java/com/company/sample/tree/btree/BinaryTreeNodeRemovalTest.java index 69f5852..eed8472 100644 --- a/src/test/java/com/company/sample/tree/btree/BinaryTreeNodeRemovalTest.java +++ b/src/test/java/com/company/sample/tree/btree/BinaryTreeNodeRemovalTest.java @@ -4,11 +4,36 @@ import org.junit.Before; class BinaryTreeNodeRemovalTest { + private static Node testTree; + + // 31 + // / \ + // 17 72 + // / \ + // 55 82 + // / \ + // 49 69 @Before public void buildFullBinarySearchTree() { //Root level Node root = new Node(31); root.isRoot = true; + testTree = root; + + //2nd + Node leftChildOfRoot = new Node(17); + Node rightChildOfRoot = new Node(72); + root.leftChild = leftChildOfRoot; + root.rightChild = rightChildOfRoot; + + //3rd + Node leftOfRightRootChild = new Node(55); + Node rightOfRightRootChild = new Node(82); + rightChildOfRoot.leftChild = leftOfRightRootChild; + rightChildOfRoot.rightChild = rightOfRightRootChild; + + //4th + Node leftChildOfRightChildOfRightRootChild = new Node(69); } } \ No newline at end of file From fdc0c0eb447ee9b2138c18eb855685e78798b1c1 Mon Sep 17 00:00:00 2001 From: rikim Date: Sat, 14 Mar 2020 20:53:52 +0900 Subject: [PATCH 6/8] Add verify B-search tree logic --- .../tree/btree/BinaryTreeNodeRemovalTest.java | 67 +++++++++++++++++-- 1 file changed, 63 insertions(+), 4 deletions(-) diff --git a/src/test/java/com/company/sample/tree/btree/BinaryTreeNodeRemovalTest.java b/src/test/java/com/company/sample/tree/btree/BinaryTreeNodeRemovalTest.java index eed8472..ead018e 100644 --- a/src/test/java/com/company/sample/tree/btree/BinaryTreeNodeRemovalTest.java +++ b/src/test/java/com/company/sample/tree/btree/BinaryTreeNodeRemovalTest.java @@ -1,9 +1,15 @@ package com.company.sample.tree.btree; import com.company.sample.tree.Node; -import org.junit.Before; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; + +import java.util.LinkedList; + +import static org.assertj.core.api.Assertions.assertThat; class BinaryTreeNodeRemovalTest { + private static BinaryTreeNodeRemoval binaryTreeNodeRemoval = new BinaryTreeNodeRemoval(); private static Node testTree; @@ -14,8 +20,8 @@ class BinaryTreeNodeRemovalTest { // 55 82 // / \ // 49 69 - @Before - public void buildFullBinarySearchTree() { + @BeforeAll + public static void buildFullBinarySearchTree() { //Root level Node root = new Node(31); root.isRoot = true; @@ -34,6 +40,59 @@ public void buildFullBinarySearchTree() { rightChildOfRoot.rightChild = rightOfRightRootChild; //4th - Node leftChildOfRightChildOfRightRootChild = new Node(69); + Node leftChildOfLeftChildOfRightRootChild = new Node(49); + Node rightChildOfLeftChildOfRightRootChild = new Node(69); + leftOfRightRootChild.leftChild = leftChildOfLeftChildOfRightRootChild; + leftOfRightRootChild.rightChild = rightChildOfLeftChildOfRightRootChild; + } + + @Test + public void removeRightChildNode_thenReturnedTreeShouldBeBinarySearchTree() { + // Given + + // When + Node after = binaryTreeNodeRemoval.removeRightChildNode(testTree); + + // Then + } + + @Test + public void testVerifyBtree() { + // Given + + // When + boolean validBtree = verifyBtree(testTree); + + // Then + assertThat(validBtree).isTrue(); + } + + private boolean verifyBtree(Node tree) { + LinkedList ascending = traverseInOrder(tree); + Node prev = null; + + for (Node node : ascending) { + System.out.println(node.numericValue); + if (prev == null) { + prev = node; + } else { + if (node.numericValue < prev.numericValue) { + return false; + } + } + } + return true; + } + + private LinkedList traverseInOrder(Node parent) { + LinkedList sorted = new LinkedList<>(); + if (parent.leftChild != null) { + sorted.addAll(traverseInOrder(parent.leftChild)); + } + sorted.add(parent); + if (parent.rightChild != null) { + sorted.addAll(traverseInOrder(parent.rightChild)); + } + return sorted; } } \ No newline at end of file From b89e6f5c9bb1a7e5c9273169d33d2e90b1b5ad98 Mon Sep 17 00:00:00 2001 From: rikim Date: Sat, 14 Mar 2020 21:09:05 +0900 Subject: [PATCH 7/8] Add BinaryTreeNodeRemoval.removeRootNodeOfBSearchTre and mergeBTree --- .../tree/btree/BinaryTreeNodeRemoval.java | 19 +++++++++++++++++++ .../tree/btree/BinaryTreeNodeRemovalTest.java | 3 ++- 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/company/sample/tree/btree/BinaryTreeNodeRemoval.java b/src/main/java/com/company/sample/tree/btree/BinaryTreeNodeRemoval.java index e09693a..36e21b0 100644 --- a/src/main/java/com/company/sample/tree/btree/BinaryTreeNodeRemoval.java +++ b/src/main/java/com/company/sample/tree/btree/BinaryTreeNodeRemoval.java @@ -1,4 +1,23 @@ package com.company.sample.tree.btree; +import com.company.sample.tree.Node; + public class BinaryTreeNodeRemoval { + + public Node removeRootNodeOfBSearchTre(Node binarySearchTree) { + Node prevLeft = binarySearchTree.leftChild; + binarySearchTree.numericValue = prevLeft.numericValue; + binarySearchTree.rightChild = mergeBTree(binarySearchTree.rightChild, prevLeft.rightChild); + binarySearchTree.leftChild = prevLeft.leftChild; + return binarySearchTree; + } + + public Node mergeBTree(Node bigger, Node smaller) { + if (bigger.leftChild == null) { + bigger.leftChild = smaller; + return bigger; + } + bigger.leftChild = mergeBTree(bigger.leftChild, smaller); + return bigger; + } } diff --git a/src/test/java/com/company/sample/tree/btree/BinaryTreeNodeRemovalTest.java b/src/test/java/com/company/sample/tree/btree/BinaryTreeNodeRemovalTest.java index ead018e..80d6fa3 100644 --- a/src/test/java/com/company/sample/tree/btree/BinaryTreeNodeRemovalTest.java +++ b/src/test/java/com/company/sample/tree/btree/BinaryTreeNodeRemovalTest.java @@ -51,9 +51,10 @@ public void removeRightChildNode_thenReturnedTreeShouldBeBinarySearchTree() { // Given // When - Node after = binaryTreeNodeRemoval.removeRightChildNode(testTree); + testTree.rightChild = binaryTreeNodeRemoval.removeRootNodeOfBSearchTre(testTree.rightChild); // Then + assertThat(verifyBtree(testTree)).isTrue(); } @Test From 9445475634fc172f42b0e18800939b90f1c6df28 Mon Sep 17 00:00:00 2001 From: rikim Date: Sat, 14 Mar 2020 21:18:57 +0900 Subject: [PATCH 8/8] Rename a test case to be more specific --- .../company/sample/tree/btree/BinaryTreeNodeRemovalTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/com/company/sample/tree/btree/BinaryTreeNodeRemovalTest.java b/src/test/java/com/company/sample/tree/btree/BinaryTreeNodeRemovalTest.java index 80d6fa3..ae608b5 100644 --- a/src/test/java/com/company/sample/tree/btree/BinaryTreeNodeRemovalTest.java +++ b/src/test/java/com/company/sample/tree/btree/BinaryTreeNodeRemovalTest.java @@ -58,7 +58,7 @@ public void removeRightChildNode_thenReturnedTreeShouldBeBinarySearchTree() { } @Test - public void testVerifyBtree() { + public void testVerifyBtree_whenValidBinarySearchTreeIsGiven_thenReturningTrue() { // Given // When