A data structure that consists of nodes in a parent / child relationship
class Node {
constructor(value) {
this.value = value;
this.left = null;
this.right = null;
}
}
class BinarySearchTree {
constructor() {
this.root = null;
}
}
Inserting(Iteratively or Recursively)
insert(value) {
let newNode = new Node(value);
if (this.root === null) {
this.root = newNode;
return this;
} else {
let current = this.root;
while (true) {
if (value === current.value) return undefined;
if (value < current.value) {
if (current.left === null) {
current.left = newNode;
return this;
} else {
current = current.left;
}
} else if (value > current.value) {
if (current.right === null) {
current.right = newNode;
return this;
} else {
current = current.right;
}
}
}
}
}
Finding a node
find(value) {
if (this.root === null) return false;
let current = this.root;
let found = false;
while (current && !found) {
if (value < current.value) {
current = current.left;
} else if (value > current.vlue) {
current = current.right;
} else {
found = true;
}
}
if (!found) return undefined;
return current;
}
contains(value) {
if (this.root === null) return false;
let current = this.root;
let found = false;
while (current && !found) {
if (value < current.value) {
current = current.left;
} else if (value > current.value) {
current = current.right;
} else {
return true;
}
}
return false;
}
BFS
BFS() {
let node = this.root;
let data = [];
let queue = [];
queue.push(node);
while (queue.length) {
node = queue.shift();
data.push(node.value);
if (node.left) queue.push(node.left);
if (node.right) queue.push(node.right);
}
return data;
}
DFS (Depth First Search)
(1) Preorder - recursively
DFSPreOrder() {
let data = [];
let current = this.root;
function traverse(node) {
data.push(node.value);
if (node.left) traverse(node.left);
if (node.right) traverse(node.right);
}
traverse(current);
return data;
}
(2) Postorder - recursively
DFSPostOrder() {
let data = [];
let current = this.root;
function traverse(node) {
if (node.left) traverse(node.left);
if (node.right) traverse(node.right);
data.push(node.value);
}
traverse(current);
return data;
}
(3) InOrder - recursively
DFSInOrder() {
let data = [];
let current = this.root;
function traverse(node) {
if (node.left) traverse(node.left);
data.push(node.value);
if (node.right) traverse(node.right);
}
traverse(current);
return data;
}
Not guaranteed
์๊ฐ ๋ณต์ก๋ ์ธก๋ฉด์์ BFS ์ DFS ๋ ํฌ๊ฒ ์ฐจ์ด๊ฐ ์๋ค. ๋ค๋ค ๋ฐ์ดํฐ ์์ด ๋์ด๋ ์๋ก ์คํ ํ์๋ ์ฆ๊ฐํ๊ธฐ ๋๋ฌธ์ด๋ค. tree์ ๊น์ด๋ณด๋ค ๊ฐ๋ก ๊ธธ์ด๊ฐ ๋์ ๊ฒฝ์ฐ DFS๊ฐ ๋ ์ ์ ํ๋ค. ๊ณต๊ฐ ๋ณต์ก๋๊ฐ BFS๋ณด๋ค ์๊ธฐ ๋๋ฌธ, BFS์ ๊ฒฝ์ฐ์๋ ํ์์ด ํ์ํ ํ์ ๋ ธ๋๋ฅผ ๋ชจ๋ ํ์ ์ ์ฅํด๋์ผํ๊ธฐ ๋๋ฌธ์ ํธ๋ฆฌ์ ๊ฐ๋ก ๊ธธ์ด๊ฐ ๋์ด๋ ์๋ก ์ฉ๋์ ๋ง์ด ์ฐจ์งํ๋ค. ์ด ๋ฐ๋์ ๊ฒฝ์ฐ, ์ฆ ๊ฐ๋ก๊ธธ์ด๊ฐ ์ข๊ณ ๊น์ด๊ฐ ๊น์ ๊ฒฝ์ฐ์๋ BFS๊ฐ ๋ ์ ์ ํ๋ค. ๊น์ด๊ฐ ๊น์ด์ง์๋ก DFS์ ์ฌ๊ท๊ฐ ์๋ํ๋ฉด์ ๊ธฐ์ตํด์ผํ ์์๋ค์ด ๋ง์์ง๊ธฐ ๋๋ฌธ์ด๋ค. BFS ๋ ํ์ ์ ์ฅํด๋๊ณ ๋ค ๋ ๋ ค๋ฒ๋ฆฌ๋ฉด์ ์ด๋ํ๊ธฐ ๋๋ฌธ์ ์ฉ๋ ์ฐจ์ง๊ฐ ๋ํ๋ค.
-BST ํ์ํ ๋ inorder๋ก ํ์ํ๋ฉด ์ค๋ฆ์ฐจ์์ผ๋ก sorting๋ ๋ฐ์ดํฐ๋ฅผ ์ป์ ์ ์๋ค.
-BST ํ์ํ ๋ preorder๋ก ํ์ํ๋ฉด ํธ๋ฆฌ ๋ชจ์์ด ๊ทธ๋๋ก ๋ด๊ธด ๋ฐ์ดํฐ๋ฅผ ์ป์ ์ ์๋ค. root data์์ ํ์์ด ์์๋๊ธฐ ๋๋ฌธ