ํธ๋ฆฌ ์ํ๋?
ํธ๋ฆฌ ์ํ๋ ์ด๋ค ํธ๋ฆฌ์์๋ ์ฌ์ฉ ๊ฐ๋ฅํ ๊ฐ๋ ์ด๋ค. ํธ๋ฆฌ ๋ด์ ๋ชจ๋ ๋ ธ๋๋ฅผ ํ ๋ฒ์ฉ ๋ฐฉ๋ฌธํ ์ ์๋๋ก ํ๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ค. ์ด๋ฌํ ํธ๋ฆฌ๋ฅผ ํ ๋ฒ์ฉ ๋ ์ ์๋ ๋ฐฉ๋ฒ์๋ ๋ค ๊ฐ์ง ๋ฐฉ๋ฒ์ด ์๋ค.

1. ๋๋น์ฐ์ ํ์ BFS(Breadth First Search)
๋ฃจํธ ๋ ธ๋๋ถํฐ ์์ํด์ ์๋๋ก ๋ด๋ ค๊ฐ๋ฉด์ ๊ฐ์ ๋ ๋ฒจ์ ์๋ ๋ชจ๋ ๋ ธ๋๋ค์ ๊ฐ๋ก์ง๋ฌ์ ๊ฑฐ์ณ๊ฐ๋ ๋ฐฉ์์ด๋ค.
๊ตฌํ
// ๊ธฐ์กด BST์์ ํ์ํ๋ BFS์ด๋ฏ๋ก BST ํด๋์ค์ ๋ฉ์๋๋ก ์ถ๊ฐ
BFS() {
// ํ์ํ๋ฉด์ ์์ง์ด๋ ์ node
var node = this.root,
// ํ์ ๊ฒฝ๋ก๋ฅผ ์ ์ฅํ๋ data ๋ฐฐ์ด
data = [],
// ์์ผ๋ก ํ์ํ ๊ณณ์ ๋ด์๋๋ queue ๋ฐฐ์ด
queue = [];
queue.push(this.root);
// queue ๋ฐฐ์ด์ด ๋น ๋๊น์ง ๊ณ์ ๋ฐ๋ณตํด์ ํ์
// ๋น ๋ฐฐ์ด์ ์ฐธ์ ๊ฐ์ ๊ฐ์ง๋ฏ๋ก length๊ฐ 0์ผ ๋ falthy๊ฐ์ ๊ฐ์ง๋ ๊ฒ์ ์ด์ฉ
while (queue.length) {
node = queue.shift();
data.push(node.val);
// ์ผ์ชฝ๊ณผ ์ค๋ฅธ์ชฝ์ ํ์ํ ์ ์๋ ๋
ธ๋๊ฐ ์์ผ๋ฉด ๋ชจ๋ queue์ ๋ฃ์
if (node.left) queue.push(node.left);
if (node.right) queue.push(node.right);
}
return data;
}2. ๊น์ด์ฐ์ ํ์ DFS(Depth First Search)
๊น์ด์ฐ์ ํ์์ ๋ด๊ฐ ์ฒ์ ํ์ํ๋ ๋ ธ๋์์๋ถํฐ ๊ณ์ ๋๊น์ง, ์ฆ ์์ง์ผ๋ก ํธ๋ฆฌ์ ๋๊น์ง ๋ค์ด๊ฐ๋ค๊ฐ ๋ ์ด์ ํ์ํ ๋ ธ๋๊ฐ ์๋ค๋ฉด ๋์ค๊ณ , ํ์ํ ๋ ธ๋๊ฐ ์๋ค๋ฉด ๋ค์ ๋์๊ฐ ๋๊ฐ์ด ํ์์ ๊ณ์ ์์ผ๋ก ํ๊ณ ๋ค๋ฉฐ ์ฌ๊ท์ ์ผ๋ก ํ์ํ๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ค. ์ํ์ผ๋ก ํ์์ ํ๋ ๋๋น ์ฐ์ ํ์(BFS)์๋ ํ์ ๋ฐฉ์ ์์ฒด๊ฐ ๋ค๋ฅด๋ค.
๊น์ด์ฐ์ ํ์์๋ ํ์ ์์์ ๋ฐ๋ผ ์ธ ๊ฐ์ง๋ก ๋๋ ์ ์๋ค. ํ์ ์์์ ์ด๋ฆ์ ๊ฐ์ด๋ฐ, ์ฆ ๋ฃจํธ ๋ ธ๋์ ์์น๊ฐ ์ด๋ค ์์์ ์ค๋์ง์ ๋ฐ๋ผ ์ ์์ํ, ํ์์ํ, ์ค์์ํ๋ก ๋๋์ด์ง๋ค.
2-1. ์ ์ ํ์(PreOrder)
์ ์ ํ์์ ๊ฐ์ฅ ์ฒ์ ๋ ธ๋์ ์ ๊ทผํ ์ดํ์ ์ผ์ชฝ ์๋ธํธ๋ฆฌ๋ฅผ ์ฌ๊ท์ ์ผ๋ก ์ ์์ํํ๊ณ ์ค๋ฅธ์ชฝ ์๋ธํธ๋ฆฌ๋ฅผ ์ฌ๊ท์ ์ผ๋ก ์ ์์ํํ๋ ์์ผ๋ก ํ์ํ๋ค.
๊ตฌํ
DFSPreOrder() {
// ๋ฐฉ๋ฌธํ ๋
ธ๋๋ฅผ ์ ์ฅํ๋ ๋ฐฐ์ด์ธ visited
var visited = [];
function traverse(node) {
//๋ฐฉ๋ฌธํ ๋
ธ๋์ ํด๋น ๋
ธ๋์ ๊ฐ์ ์ถ๊ฐ
visited.push(node.val);
// ์ผ์ชฝ -> ์ค๋ฅธ์ชฝ ์์๋๋ก ํ์์ด๋ฏ๋ก ์ผ์ชฝ๋ถํฐ ์ฌ๊ท์ ์ผ๋ก ํธ์ถ
if (node.left) traverse(node.left);
if (node.right) traverse(right);
}
// ๋ฃจํธ๋
ธ๋๋ถํฐ ํ์์ ์์ํ์ฌ ์ฌ๊ท์ ์ผ๋ก ํ๊ณ ๋ค๋ฉฐ ํ์
traverse(this.root);
return visited;
}2-2. ํ์ ํ์(PostOrder)
ํ์ ํ์์ ๊ฐ์ฅ ์ผ์ชฝ ์๋ธํธ๋ฆฌ๋ฅผ ์ฌ๊ท์ ์ผ๋ก ํ์์ํํ๊ณ ์ค๋ฅธ์ชฝ ์๋ธํธ๋ฆฌ๋ฅผ ์ฌ๊ท์ ์ผ๋ก ํ์์ํํ ๋ค ๋ง์ง๋ง์ผ๋ก ๋ฃจํธ ๋ ธ๋๋ฅผ ํ์ํ์ํ๋ ์์ผ๋ก ํ์ํ๋ค.
๊ตฌํ
DFSPostOrder() {
// ๋ฐฉ๋ฌธํ ๋
ธ๋๋ฅผ ์ ์ฅํ๋ ๋ฐฐ์ด์ธ visited
var visited = [];
function traverse(node) {
// ์ผ์ชฝ -> ์ค๋ฅธ์ชฝ ์์๋๋ก ํ์์ด๋ฏ๋ก ์ผ์ชฝ๋ถํฐ ์ฌ๊ท์ ์ผ๋ก ํธ์ถ
if (node.left) traverse(node.left);
if (node.right) traverse(right);
//ํ์์์๋ ๋ง์ง๋ง์ ๋ฃจํธ ๋
ธ๋๋ฅผ ์ถ๊ฐ
visited.push(node.val);
}
// ๋ฃจํธ๋
ธ๋๋ถํฐ ํ์์ ์์ํ์ฌ ์ฌ๊ท์ ์ผ๋ก ํ๊ณ ๋ค๋ฉฐ ํ์
traverse(this.root);
return visited;
}2-3. ์ค์ ํ์(InOrder)
์ค์ ํ์์ ์ผ์ชฝ ์๋ธํธ๋ฆฌ๋ฅผ ์ฌ๊ท์ ์ผ๋ก ์ค์์ํํ ๋ค์ ๋ฃจํธ ๋ ธ๋๋ฅผ ๊ฑฐ์ณ ์ค๋ฅธ์ชฝ ์๋ธํธ๋ฆฌ๋ก ๊ฐ ๋ค ์ค๋ฅธ์ชฝ ์๋ธํธ๋ฆฌ๋ฅผ ์ฌ๊ท์ ์ผ๋ก ์ค์์ํํ๋ ์์ผ๋ก ํ์ํ๋ค.
๊ตฌํ
DFSInOrder() {
// ๋ฐฉ๋ฌธํ ๋
ธ๋๋ฅผ ์ ์ฅํ๋ ๋ฐฐ์ด์ธ visited
var visited = [];
function traverse(node) {
// ์ผ์ชฝ -> ์ค๋ฅธ์ชฝ ์์๋๋ก ํ์์ด๋ฏ๋ก ์ผ์ชฝ๋ถํฐ ์ฌ๊ท์ ์ผ๋ก ํธ์ถ
// ๋ค๋ฅธ ๋ฌธ๋ฒ์ ์ฌ์ฉํ์ ๋ฟ if๋ฌธ๊ณผ ์๋ ๋ฐฉ์์ ๊ฐ์
node.left && traverse(node.left);
// ์ค์์์๋ ์ค๊ฐ์ ๋ฃจํธ ๋
ธ๋์ ๊ฐ์ ์ถ๊ฐํ ๋ค์ ์ค๋ฅธ์ชฝ ์๋ธํธ๋ฆฌ๋ก ์ด๋ํ์ฌ ์ฌ๊ท์ ์ผ๋ก ํ์
visited.push(node.val);
node.right && traverse(right);
}
// ๋ฃจํธ๋
ธ๋๋ถํฐ ํ์์ ์์ํ์ฌ ์ฌ๊ท์ ์ผ๋ก ํ๊ณ ๋ค๋ฉฐ ํ์
traverse(this.root);
return visited;
}BFS์ DFS์ค ๋ฌด์์ด ๋ ๋์ ์๊ณ ๋ฆฌ์ฆ์ธ๊ฐ?
๊ฒฐ๋ก ๋ถํฐ ๋งํ์๋ฉด ์ํฉ์ ๋ฐ๋ผ ๋ค๋ฅด๋ค. ์ฆ, ํธ๋ฆฌ์ ํํ์ ๋ฐ๋ผ ์ฌ์ฉํ๋ ์๊ณ ๋ฆฌ์ฆ์ ํจ์จ์ ์ธ ๋ฉด์์ ์ฐจ์ด๊ฐ ๋ฐ์ํ๊ฒ ๋๋ ๊ฒ์ด๋ค.
์ฌ์ค ์๊ฐ๋ณต์ก๋์ ์ธ ์ธก๋ฉด์์๋ ๊ฐ์ ์๋ฐ์ ์๋ค. ํธ๋ฆฌ ์ํ๋ผ๋๊ฒ ์ด์ฐ ๋๋ ๊ฐ์ ๋ชจ๋ ๋ ธ๋๋ฅผ ๋ฐฉ๋ฌธํด์ผ ์ํ์ด๊ธฐ ๋๋ฌธ์ ๊ฒฐ๊ตญ ๋ฐฉ๋ฌธํ๋๋ฐ ๋๋ ์๊ฐ ๋ณต์ก๋๋ ๊ฐ์ง๋ง ๊ณต๊ฐ๋ณต์ก๋์ ์ธ ์ธก๋ฉด์์ ํจ์จ์ฑ์ด ๊ฐ๋ฆด ์ ์๋ค.
BFS์ ๊ฒฝ์ฐ
์์ ๊ฐ์ ๊ทธ๋ฆผ์ ๋ณด๋ฉด ๋
ธ๋์ ์๋ 2๋ฐฐ๋งํผ ๊ณ์ ์ฆ๊ฐํ๋ค. ์ง๊ธ์ ์ผ๋ง ์์ง๋ง 2์ ๊ฑฐ๋ญ์ ๊ณฑ์ ๊ธฐํ๊ธ์์ ์ผ๋ก ์ฆ๊ฐํ๊ธฐ ๋๋ฌธ์ ๋ ๋ฒจ์ด ๊น์ด์ง์๋ก ๋
ธ๋์ ์๋ ๋งค์ฐ ๋ง์์ง๋ค.
๋ง์ฝ ์ด๋ฐ ํธ๋ฆฌ ๊ตฌ์กฐ์ ๋ชจ๋ ๋ ธ๋๊ฐ ๊ฝ ์ฐจ์๋ ํํ๊ฐ ๋๋ค๋ฉด BFS๋ก ํ์์ ํ ๋ ๋ชจ๋ ๋ฐ๋ก ์๋ ๋ชจ๋ ๋ ธ๋๋ฅผ ๋ฐฐ์ด์ ์ ์ฅํ ๋ค ํ๋์ฉ ๋นผ๊ฐ๋ฉด์ ์ฐพ๊ฒ ๋๋๋ฐ, ์ฌ๊ธฐ์ ์ฐ์ด๋ ๊ณต๊ฐ๋ณต์ก๋ ๋ํ ๊ธฐํ๊ธ์์ ์ผ๋ก ๋์ด๋๊ฒ ๋๋ค.
๋ฐ๋ผ์ ๊ณต๊ฐ๋ณต์ก๋์ ์ธ ์ธก๋ฉด์์ ์ด๋ฌํ ํํ์ ํธ๋ฆฌ๋ BFS๊ฐ ํจ์จ์ ์ด์ง ๋ชปํ๋ค.
DFS์ ๊ฒฝ์ฐ

DFS์ ๊ฒฝ์ฐ์๋ ์ ์ ๋งํ๋ ๋ ธ๋ต ์ด์งํธ๋ฆฌ์ฒ๋ผ ํ ์ค๋ก ์ด์ด์ ธ์๋ ์ด์งํธ๋ฆฌ๊ฐ ํจ์จ์ ์ด์ง ๋ชปํ๋ค. ์ฌ๊ธฐ์๋ ๊น์ด ์ฐ์ ํ์์ ํ๊ฒ ๋ ๊ฒฝ์ฐ ๋ฌด์กฐ๊ฑด ๊ณ์ ๋ ๋ ๋ฒจ๊น์ง ์ฌ๊ท์ ์ผ๋ก ํธ์ถํ๋ฉด์ ๊ทธ ์ ๋ ๋ฒจ๊น์ง๋ ๋ชจ๋ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅ๋์ด ์์ด์ผ ํ๊ธฐ ๋๋ฌธ์ ๊ณต๊ฐ๋ณต์ก๋์ ์ธ ์ธก๋ฉด์์ ํจ์จ์ฑ์ด ๋จ์ด์ง๋ค.
์ด๋ฌํ ํธ๋ฆฌ์ BFS ํ์์ ํ ๊ฒฝ์ฐ์ ๊ณ์ํด์ ํ๋์ ๋ ธ๋๋ง ๋ฐฐ์ด์ ๋ค์ด๊ฐ๊ณ ํ์์ ์งํํ๊ธฐ ๋๋ฌธ์ ๋ฉ๋ชจ๋ฆฌ์์ ์ฌ์ฉ๋๋ ๊ณต๊ฐ์ด ๊ฑฐ์ ์์ด ๊ณต๊ฐ๋ณต์ก๋์ ์ธ ์ธก๋ฉด์์ ํจ์จ์ ์ด๋ค.
DFS์์ ์๋ก ๋ค๋ฅธ ์ข ๋ฅ์ ํ์์ ์ธ์ ์ํํด์ผ ํ๋๊ฐ?
์ฌ์ค ์ฌ๊ธฐ์๋ ๋ช ํํ ๋ต์ ์๋ค. ์ํฉ์ ๋ฐ๋ผ ๋ค๋ฅผ ๋ฟ์ด๋ค
์ค์์ํ(Inorder)์ ๊ฒฝ์ฐ
์ค์์ํ์ ๊ฒฝ์ฐ ํธ๋ฆฌ์ ๊ฐ๋ค์ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌํ ๋ ์ ์ฉํ๊ฒ ์ฐ์ธ๋ค. DFS๋ ์ด์งํ์ํธ๋ฆฌ, ์ฆ BST ํธ๋ฆฌ์ ์ฐ์ด๋ ํ์ ๋ฐฉ๋ฒ์ด๋ฏ๋ก ํ์์ ํ ๋ ์ผ์ชฝ-์ค์-์ค๋ฅธ์ชฝ ์์ด ๊ณง ์ค๋ฆ์ฐจ์์ด๊ธฐ ๋๋ฌธ์ด๋ค.
์ ์์ํ(Preorder)์ ๊ฒฝ์ฐ
์ ์์ํ์ ๊ฒฝ์ฐ ํธ๋ฆฌ๋ฅผ ๋ณต์ฌํ๊ฑฐ๋ ํํํํด์ ํ์ผ์ด๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ฑ์ ์ ์ฅํ๋ ๊ฒฝ์ฐ์ ์ ์ฉํ๊ฒ ์ฌ์ฉ๋ ์ ์๋ค. ์์๋๋ก ์์์ ๋๊ฐ์ ์ ์์ํ ์์ผ๋ก ๋ฃ์ด์ฃผ๋ฉด ๋ค์๊ธ ํธ๋ฆฌ๋ฅผ ๊ตฌ์ฑํ๊ธฐ ์ฉ์ดํด์ง๋ค.