From 11ef12ef2c81189ef3426feb43e3bc56c0c14211 Mon Sep 17 00:00:00 2001 From: Ashok Dey Date: Tue, 8 Oct 2019 15:06:36 +0530 Subject: [PATCH 01/10] update: isEmpty() --- src/_DataStructures_/Trees/BST/index.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/_DataStructures_/Trees/BST/index.js b/src/_DataStructures_/Trees/BST/index.js index 0a1ad377..4ad53553 100644 --- a/src/_DataStructures_/Trees/BST/index.js +++ b/src/_DataStructures_/Trees/BST/index.js @@ -82,6 +82,10 @@ class BinarySearchTree { } return false; } + + isEmpty() { + return this.root === null; + } } // const bst = new BinarySearchTree(6); From 807668c0059bb09f97db136bc6a0a64ad6ec5dca Mon Sep 17 00:00:00 2001 From: Ashok Dey Date: Tue, 8 Oct 2019 23:50:48 +0530 Subject: [PATCH 02/10] update: Added layered methods to simplify BST APIs --- src/_DataStructures_/Trees/BST/index.js | 42 +++++++++++++++++++------ 1 file changed, 32 insertions(+), 10 deletions(-) diff --git a/src/_DataStructures_/Trees/BST/index.js b/src/_DataStructures_/Trees/BST/index.js index 4ad53553..6fb28717 100644 --- a/src/_DataStructures_/Trees/BST/index.js +++ b/src/_DataStructures_/Trees/BST/index.js @@ -86,29 +86,51 @@ class BinarySearchTree { isEmpty() { return this.root === null; } + + /** Layered methods to simplify the BST API */ + + add(value) { + return this.insert(this.root, value); + } + + traversePreorder() { + return this.preorder(this.root); + } + + traversePostorder() { + return this.postorder(this.root); + } + + traverseInorder() { + return this.inorder(this.root); + } + + searchFor(value) { + return this.search(this.root, value); + } } // const bst = new BinarySearchTree(6); // console.log(bst.root); -// bst.insert(bst.root, 4); -// bst.insert(bst.root, 9); -// bst.insert(bst.root, 2); -// bst.insert(bst.root, 5); -// bst.insert(bst.root, 8); -// bst.insert(bst.root, 12); +// bst.add(4); +// bst.add(9); +// bst.add(2); +// bst.add(5); +// bst.add(8); +// bst.add(12); // console.log(bst.root); -// const preorder = bst.preorder(bst.root); +// const preorder = bst.traversePreorder(); // console.log('Preorder Traversal - ', preorder); -// const inorder = bst.inorder(bst.root); +// const inorder = bst.traverseInorder(); // console.log('Inorder Traversal - ', inorder); -// const postorder = bst.postorder(bst.root); +// const postorder = bst.traversePostorder(); // console.log('Postorder Traversal - ', postorder); // const search = 18; -// console.log(`Search for ${search}`, bst.search(bst.root, search)); +// console.log(`Search for ${search}`, bst.searchFor(search)); module.exports = BinarySearchTree; From 590ebb1f6866c4f8084cf43b0f5340fdf3b5245b Mon Sep 17 00:00:00 2001 From: Ashok Dey Date: Wed, 9 Oct 2019 00:15:38 +0530 Subject: [PATCH 03/10] update: delete in BST --- src/_DataStructures_/Trees/BST/index.js | 81 +++++++++++++++++++------ 1 file changed, 64 insertions(+), 17 deletions(-) diff --git a/src/_DataStructures_/Trees/BST/index.js b/src/_DataStructures_/Trees/BST/index.js index 6fb28717..a584ce3c 100644 --- a/src/_DataStructures_/Trees/BST/index.js +++ b/src/_DataStructures_/Trees/BST/index.js @@ -83,6 +83,31 @@ class BinarySearchTree { return false; } + delete(root, value) { + if (root === null) { + return root; + } + + if (value> root.value) { + // eslint-disable-next-line no-param-reassign + root.rightChild = this.delete(root.rightChild, value); + } else if (value < root.value) { + // eslint-disable-next-line no-param-reassign + root.leftChild = this.delete(root.leftChild, value); + } else { + // found the node + if (root.leftChild === null) { + // there is a right sub-tree + return root.rightChild; + } + if (root.rightChild === null) { + // there is a left sub-tree + return root.leftChild; + } + } + return root; + } + isEmpty() { return this.root === null; } @@ -108,29 +133,51 @@ class BinarySearchTree { searchFor(value) { return this.search(this.root, value); } + + remove(value) { + return this.delete(this.root, value); + } } -// const bst = new BinarySearchTree(6); -// console.log(bst.root); -// bst.add(4); -// bst.add(9); -// bst.add(2); -// bst.add(5); -// bst.add(8); -// bst.add(12); +const bst = new BinarySearchTree(6); +console.log(bst.root); +bst.add(4); +bst.add(9); +bst.add(2); +bst.add(5); +bst.add(8); +bst.add(12); + +console.log(bst.root); + +const preorder = bst.traversePreorder(); +console.log('Preorder Traversal - ', preorder); + +const inorder = bst.traverseInorder(); +console.log('Inorder Traversal - ', inorder); + +const postorder = bst.traversePostorder(); +console.log('Postorder Traversal - ', postorder); + +const search = 18; +console.log(`Search for ${search}`, bst.searchFor(search)); + +bst.remove(8); +console.log(bst.traversePreorder()); -// console.log(bst.root); +bst.remove(5); +console.log(bst.traversePreorder()); -// const preorder = bst.traversePreorder(); -// console.log('Preorder Traversal - ', preorder); +bst.remove(4); +console.log(bst.traversePreorder()); -// const inorder = bst.traverseInorder(); -// console.log('Inorder Traversal - ', inorder); +bst.remove(2); +console.log(bst.traversePreorder()); -// const postorder = bst.traversePostorder(); -// console.log('Postorder Traversal - ', postorder); +bst.remove(9); +console.log(bst.traversePreorder()); -// const search = 18; -// console.log(`Search for ${search}`, bst.searchFor(search)); +bst.remove(12); +console.log(bst.traversePreorder()); module.exports = BinarySearchTree; From ac536a1c2cb30c9a7866ffd8e4996e2aeb748a8c Mon Sep 17 00:00:00 2001 From: Ashok Dey Date: Wed, 9 Oct 2019 00:16:06 +0530 Subject: [PATCH 04/10] cleanup --- src/_DataStructures_/Trees/BST/index.js | 58 ++++++++++++------------- 1 file changed, 29 insertions(+), 29 deletions(-) diff --git a/src/_DataStructures_/Trees/BST/index.js b/src/_DataStructures_/Trees/BST/index.js index a584ce3c..d50f34d4 100644 --- a/src/_DataStructures_/Trees/BST/index.js +++ b/src/_DataStructures_/Trees/BST/index.js @@ -139,45 +139,45 @@ class BinarySearchTree { } } -const bst = new BinarySearchTree(6); -console.log(bst.root); -bst.add(4); -bst.add(9); -bst.add(2); -bst.add(5); -bst.add(8); -bst.add(12); +// const bst = new BinarySearchTree(6); +// console.log(bst.root); +// bst.add(4); +// bst.add(9); +// bst.add(2); +// bst.add(5); +// bst.add(8); +// bst.add(12); -console.log(bst.root); +// console.log(bst.root); -const preorder = bst.traversePreorder(); -console.log('Preorder Traversal - ', preorder); +// const preorder = bst.traversePreorder(); +// console.log('Preorder Traversal - ', preorder); -const inorder = bst.traverseInorder(); -console.log('Inorder Traversal - ', inorder); +// const inorder = bst.traverseInorder(); +// console.log('Inorder Traversal - ', inorder); -const postorder = bst.traversePostorder(); -console.log('Postorder Traversal - ', postorder); +// const postorder = bst.traversePostorder(); +// console.log('Postorder Traversal - ', postorder); -const search = 18; -console.log(`Search for ${search}`, bst.searchFor(search)); +// const search = 18; +// console.log(`Search for ${search}`, bst.searchFor(search)); -bst.remove(8); -console.log(bst.traversePreorder()); +// bst.remove(8); +// console.log(bst.traversePreorder()); -bst.remove(5); -console.log(bst.traversePreorder()); +// bst.remove(5); +// console.log(bst.traversePreorder()); -bst.remove(4); -console.log(bst.traversePreorder()); +// bst.remove(4); +// console.log(bst.traversePreorder()); -bst.remove(2); -console.log(bst.traversePreorder()); +// bst.remove(2); +// console.log(bst.traversePreorder()); -bst.remove(9); -console.log(bst.traversePreorder()); +// bst.remove(9); +// console.log(bst.traversePreorder()); -bst.remove(12); -console.log(bst.traversePreorder()); +// bst.remove(12); +// console.log(bst.traversePreorder()); module.exports = BinarySearchTree; From 3d4803831e4d198889ec99fdcb532b84b88ac76a Mon Sep 17 00:00:00 2001 From: Ashok Dey Date: Wed, 9 Oct 2019 01:54:33 +0530 Subject: [PATCH 05/10] update: find min of BST --- src/_DataStructures_/Trees/BST/index.js | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/_DataStructures_/Trees/BST/index.js b/src/_DataStructures_/Trees/BST/index.js index d50f34d4..919e511f 100644 --- a/src/_DataStructures_/Trees/BST/index.js +++ b/src/_DataStructures_/Trees/BST/index.js @@ -108,6 +108,12 @@ class BinarySearchTree { return root; } + findMinNode(root) { + /** The minnimum values is the let most leaf node in BST */ + if (root.leftChild === null) return root; + return this.findMinNode(root.leftChild); + } + isEmpty() { return this.root === null; } @@ -134,6 +140,11 @@ class BinarySearchTree { return this.search(this.root, value); } + findMinimum() { + const minNode = this.findMinNode(this.root); + return minNode.value; + } + remove(value) { return this.delete(this.root, value); } @@ -162,8 +173,12 @@ class BinarySearchTree { // const search = 18; // console.log(`Search for ${search}`, bst.searchFor(search)); +// const minNode = bst.findMinimum(); +// console.log('Minimum value =>', minNode); + // bst.remove(8); // console.log(bst.traversePreorder()); +// console.log(bst.root); // bst.remove(5); // console.log(bst.traversePreorder()); From 409f85c1d44c607eb730937e97697e7857dad6b5 Mon Sep 17 00:00:00 2001 From: Ashok Dey Date: Wed, 9 Oct 2019 01:58:38 +0530 Subject: [PATCH 06/10] fix: missing case of 2 delete Node with 2 childs --- src/_DataStructures_/Trees/BST/index.js | 56 +++++++++++++------------ 1 file changed, 29 insertions(+), 27 deletions(-) diff --git a/src/_DataStructures_/Trees/BST/index.js b/src/_DataStructures_/Trees/BST/index.js index 919e511f..8e7c5fd7 100644 --- a/src/_DataStructures_/Trees/BST/index.js +++ b/src/_DataStructures_/Trees/BST/index.js @@ -104,6 +104,13 @@ class BinarySearchTree { // there is a left sub-tree return root.leftChild; } + // the root contain 2 childs + const minRightNode = this.findMinNode(root.rightChild); + // eslint-disable-next-line no-param-reassign + root.value = minRightNode.value; + // eslint-disable-next-line no-param-reassign + root.rightChild = this.delete(root.rightChild, minRightNode.data); + return root; } return root; } @@ -150,41 +157,36 @@ class BinarySearchTree { } } -// const bst = new BinarySearchTree(6); -// console.log(bst.root); -// bst.add(4); -// bst.add(9); -// bst.add(2); -// bst.add(5); -// bst.add(8); -// bst.add(12); +const bst = new BinarySearchTree(6); +console.log(bst.root); +bst.add(4); +bst.add(9); +bst.add(2); +bst.add(5); +bst.add(8); +bst.add(12); -// console.log(bst.root); +console.log(bst.root); -// const preorder = bst.traversePreorder(); -// console.log('Preorder Traversal - ', preorder); +const preorder = bst.traversePreorder(); +console.log('Preorder Traversal - ', preorder); -// const inorder = bst.traverseInorder(); -// console.log('Inorder Traversal - ', inorder); +const inorder = bst.traverseInorder(); +console.log('Inorder Traversal - ', inorder); -// const postorder = bst.traversePostorder(); -// console.log('Postorder Traversal - ', postorder); +const postorder = bst.traversePostorder(); +console.log('Postorder Traversal - ', postorder); -// const search = 18; -// console.log(`Search for ${search}`, bst.searchFor(search)); +const search = 18; +console.log(`Search for ${search}`, bst.searchFor(search)); -// const minNode = bst.findMinimum(); -// console.log('Minimum value =>', minNode); +const minNode = bst.findMinimum(); +console.log('Minimum value =>', minNode); -// bst.remove(8); -// console.log(bst.traversePreorder()); -// console.log(bst.root); +bst.remove(4); +console.log(bst.traversePreorder()); -// bst.remove(5); -// console.log(bst.traversePreorder()); - -// bst.remove(4); -// console.log(bst.traversePreorder()); +console.log(bst.root); // bst.remove(2); // console.log(bst.traversePreorder()); From b62984b25565d425991089dc75a448851ab97e66 Mon Sep 17 00:00:00 2001 From: Ashok Dey Date: Wed, 9 Oct 2019 01:59:04 +0530 Subject: [PATCH 07/10] cleanup --- src/_DataStructures_/Trees/BST/index.js | 51 ++++++++++--------------- 1 file changed, 21 insertions(+), 30 deletions(-) diff --git a/src/_DataStructures_/Trees/BST/index.js b/src/_DataStructures_/Trees/BST/index.js index 8e7c5fd7..93e0b691 100644 --- a/src/_DataStructures_/Trees/BST/index.js +++ b/src/_DataStructures_/Trees/BST/index.js @@ -157,44 +157,35 @@ class BinarySearchTree { } } -const bst = new BinarySearchTree(6); -console.log(bst.root); -bst.add(4); -bst.add(9); -bst.add(2); -bst.add(5); -bst.add(8); -bst.add(12); +// const bst = new BinarySearchTree(6); +// console.log(bst.root); +// bst.add(4); +// bst.add(9); +// bst.add(2); +// bst.add(5); +// bst.add(8); +// bst.add(12); -console.log(bst.root); +// console.log(bst.root); -const preorder = bst.traversePreorder(); -console.log('Preorder Traversal - ', preorder); +// const preorder = bst.traversePreorder(); +// console.log('Preorder Traversal - ', preorder); -const inorder = bst.traverseInorder(); -console.log('Inorder Traversal - ', inorder); +// const inorder = bst.traverseInorder(); +// console.log('Inorder Traversal - ', inorder); -const postorder = bst.traversePostorder(); -console.log('Postorder Traversal - ', postorder); +// const postorder = bst.traversePostorder(); +// console.log('Postorder Traversal - ', postorder); -const search = 18; -console.log(`Search for ${search}`, bst.searchFor(search)); +// const search = 18; +// console.log(`Search for ${search}`, bst.searchFor(search)); -const minNode = bst.findMinimum(); -console.log('Minimum value =>', minNode); +// const minNode = bst.findMinimum(); +// console.log('Minimum value =>', minNode); -bst.remove(4); -console.log(bst.traversePreorder()); - -console.log(bst.root); - -// bst.remove(2); +// bst.remove(4); // console.log(bst.traversePreorder()); -// bst.remove(9); -// console.log(bst.traversePreorder()); - -// bst.remove(12); -// console.log(bst.traversePreorder()); +// console.log(bst.root); module.exports = BinarySearchTree; From 9033d3a8850f4c18f153f1429e6ae9b4236f99df Mon Sep 17 00:00:00 2001 From: Ashok Dey Date: Wed, 9 Oct 2019 02:07:48 +0530 Subject: [PATCH 08/10] update: added getMaximum --- src/_DataStructures_/Trees/BST/index.js | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/src/_DataStructures_/Trees/BST/index.js b/src/_DataStructures_/Trees/BST/index.js index 93e0b691..cec69e73 100644 --- a/src/_DataStructures_/Trees/BST/index.js +++ b/src/_DataStructures_/Trees/BST/index.js @@ -121,6 +121,11 @@ class BinarySearchTree { return this.findMinNode(root.leftChild); } + findMaxNode(root) { + if (root.rightChild === null) return root; + return this.findMaxNode(root.rightChild); + } + isEmpty() { return this.root === null; } @@ -147,11 +152,16 @@ class BinarySearchTree { return this.search(this.root, value); } - findMinimum() { + getMinimum() { const minNode = this.findMinNode(this.root); return minNode.value; } + getMaximum() { + const maxNode = this.findMaxNode(this.root); + return maxNode.value; + } + remove(value) { return this.delete(this.root, value); } @@ -180,9 +190,12 @@ class BinarySearchTree { // const search = 18; // console.log(`Search for ${search}`, bst.searchFor(search)); -// const minNode = bst.findMinimum(); +// const minNode = bst.getMinimum(); // console.log('Minimum value =>', minNode); +// const maxNode = bst.getMaximum(); +// console.log('Maximum value =>', maxNode); + // bst.remove(4); // console.log(bst.traversePreorder()); From bcad3b6d8a12fc81e41b4d92ce3e18678ac4ad4f Mon Sep 17 00:00:00 2001 From: Ashok Dey Date: Wed, 9 Oct 2019 02:34:34 +0530 Subject: [PATCH 09/10] fix: undefined due to ```node.data``` --- src/_DataStructures_/Trees/BST/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/_DataStructures_/Trees/BST/index.js b/src/_DataStructures_/Trees/BST/index.js index cec69e73..aa7edb8d 100644 --- a/src/_DataStructures_/Trees/BST/index.js +++ b/src/_DataStructures_/Trees/BST/index.js @@ -109,7 +109,7 @@ class BinarySearchTree { // eslint-disable-next-line no-param-reassign root.value = minRightNode.value; // eslint-disable-next-line no-param-reassign - root.rightChild = this.delete(root.rightChild, minRightNode.data); + root.rightChild = this.delete(root.rightChild, minRightNode.value); return root; } return root; From 699fd82b895bb1aa285bcda83c118b37487003ab Mon Sep 17 00:00:00 2001 From: Ashok Dey Date: Wed, 9 Oct 2019 02:39:31 +0530 Subject: [PATCH 10/10] update: aded info for clarity --- src/_DataStructures_/Trees/BST/index.js | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/_DataStructures_/Trees/BST/index.js b/src/_DataStructures_/Trees/BST/index.js index aa7edb8d..05ef627d 100644 --- a/src/_DataStructures_/Trees/BST/index.js +++ b/src/_DataStructures_/Trees/BST/index.js @@ -104,7 +104,13 @@ class BinarySearchTree { // there is a left sub-tree return root.leftChild; } - // the root contain 2 childs + /** + * the root contain 2 childs, we got 2 options: + * 1. We can either find the Node with minimum value at from the right sub-tree + * 2. Or, we can find the Node with maximum value from the left sub-tree + * + * I'm picking up 1 here + */ const minRightNode = this.findMinNode(root.rightChild); // eslint-disable-next-line no-param-reassign root.value = minRightNode.value;

AltStyle によって変換されたページ (->オリジナル) /