Add binary search tree.

This commit is contained in:
Oleksii Trekhleb 2018-04-03 07:20:08 +03:00
parent 873024079a
commit 1513c536a6
6 changed files with 57 additions and 13 deletions

View File

@ -31,3 +31,8 @@ npm test
``` ```
npm test -- -t 'LinkedList' npm test -- -t 'LinkedList'
``` ```
## Useful Links
- [Data Structures and Algorithms on YouTube](https://www.youtube.com/playlist?list=PLLXdhg_r2hKA7DPDsunoDZ-Z769jWn4R8)

View File

@ -1,9 +1,5 @@
# Data Structures # Data Structures
**Useful Links**
- [YouTube Playlist](https://www.youtube.com/playlist?list=PLLXdhg_r2hKA7DPDsunoDZ-Z769jWn4R8)
## Common Data Structure Operations ## Common Data Structure Operations
![Common Data Structure Operations](https://github.com/trekhleb/javascript-algorithms/blob/master/assets/big-o-data-structures.png) ![Common Data Structure Operations](https://github.com/trekhleb/javascript-algorithms/blob/master/assets/big-o-data-structures.png)

View File

@ -1,7 +1,7 @@
export default class BinaryTreeNode { export default class BinaryTreeNode {
constructor(value = null, left = null, right = null) { constructor(value = null) {
this.left = left; this.left = null;
this.right = right; this.right = null;
this.value = value; this.value = value;
} }

View File

@ -26,7 +26,11 @@ describe('BinaryTreeNode', () => {
it('should traverse node', () => { it('should traverse node', () => {
const leftNode = new BinaryTreeNode(1); const leftNode = new BinaryTreeNode(1);
const rightNode = new BinaryTreeNode(3); const rightNode = new BinaryTreeNode(3);
const rootNode = new BinaryTreeNode(2, leftNode, rightNode); const rootNode = new BinaryTreeNode(2);
rootNode
.addLeft(leftNode)
.addRight(rightNode);
expect(rootNode.traverseInOrder()).toEqual([1, 2, 3]); expect(rootNode.traverseInOrder()).toEqual([1, 2, 3]);

View File

@ -21,20 +21,32 @@ export default class BinarySearchTreeNode extends BinaryTreeNode {
return this; return this;
} }
contains(value) { find(value) {
// Check the root. // Check the root.
if (this.value === value) { if (this.value === value) {
return true; return this;
} }
if (value < this.value && this.left) { if (value < this.value && this.left) {
// Check left nodes. // Check left nodes.
return this.left.contains(value); return this.left.find(value);
} else if (value > this.value && this.right) { } else if (value > this.value && this.right) {
// Check right nodes. // Check right nodes.
return this.right.contains(value); return this.right.find(value);
} }
return false; return null;
}
contains(value) {
return !!this.find(value);
}
findMin() {
if (!this.left) {
return this;
}
return this.left.findMin();
} }
} }

View File

@ -56,4 +56,31 @@ describe('BinarySearchTreeNode', () => {
expect(bstNode.contains(1)).toBeTruthy(); expect(bstNode.contains(1)).toBeTruthy();
expect(bstNode.contains(3)).toBeFalsy(); expect(bstNode.contains(3)).toBeFalsy();
}); });
it('should find min node', () => {
const node = new BinarySearchTreeNode(10);
node.insert(20);
node.insert(30);
node.insert(5);
node.insert(40);
node.insert(1);
expect(node.findMin()).not.toBeNull();
expect(node.findMin().value).toBe(1);
});
it('should find node', () => {
const node = new BinarySearchTreeNode(10);
node.insert(20);
node.insert(30);
node.insert(5);
node.insert(40);
node.insert(1);
expect(node.find(6)).toBeNull();
expect(node.find(5)).not.toBeNull();
expect(node.find(5).value).toBe(5);
});
}); });