algorithms-BFS&DFS-02.md
๐กDepth First Search/Traversal, ๊น์ด ์ฐ์ ํ์: ์ํ ๋ฐฉ์ ์์๋ณด๊ธฐ
๐ DFS๋ฅผ ์งํํ๋ ์ธ๊ฐ์ง ๋ฐฉ๋ฒ
inorder: everything in order
preorder: parent node์์ ์์, ์์ (์ผ์ชฝ โ ์ค๋ฅธ์ชฝ)
ํธ๋ฆฌ๋ฅผ recreateํ ์ ์์ต๋๋ค.
- postoder: ์์์์ ๋ถ๋ชจ๋ก โ๋ฐ๋ ๋ฐฉํฅโ์ผ๋ก ์ฌ๋ผ๊ฐ๋ฉฐ ์งํ
| ์ํ ๋ฐฉ์ | ์์ | | ------------------ | ------------------------------------------------------- | | Inorder ์ค์ ์ํ | ์ผ์ชฝ ์๋ธํธ๋ฆฌ, ๋ฃจํธ, ์ค๋ฅธ์ชฝ ์๋ธํธ๋ฆฌ ์์๋ก ๋ ธ๋๋ฅผ ๋ฐฉ๋ฌธ | | Preorder ์ ์ ์ํ | ๋ฃจํธ, ์ผ์ชฝ ์๋ธํธ๋ฆฌ, ์ค๋ฅธ์ชฝ ์๋ธํธ๋ฆฌ ์์๋ก ๋ ธ๋๋ฅผ ๋ฐฉ๋ฌธ | | Postorderํ์ ์ํ | ์ผ์ชฝ ์๋ธํธ๋ฆฌ, ์ค๋ฅธ์ชฝ ์๋ธํธ๋ฆฌ, ๋ฃจํธ ์์๋ก ๋ ธ๋๋ฅผ ๋ฐฉ๋ฌธ |
1. Inorder, ์ค์ ์ํ
- ์ผ์ชฝ ์๋ธํธ๋ฆฌ โ ๋ฃจํธ โ ์ค๋ฅธ์ชฝ ์๋ธํธ๋ฆฌ
ํธ๋ฆฌ๋ก ์์๋ณด๊ธฐ
A
/ \
B C
/ \
D E
Inorder: D - B - E - A - C
1. ํจ์ ํธ์ถ - A(root), []
2. ์ผ์ชฝ ์์ B๋ก ์ด๋, ์ฌ๊ท - B, []
์ผ์ชฝ ์์ D๋ก ์ด๋, ์ฌ๊ท
๋
ธ๋ D ๊ฐ์ ๋ฐฐ์ด์ ์ถ๊ฐ - [D]
์ค๋ฅธ์ชฝ ์์ ์์
๋
ธ๋ B ๊ฐ์ ๋ฐฐ์ด์ ์ถ๊ฐ - [D, B]
์ค๋ฅธ์ชฝ ์์ E๋ก ์ด๋, ์ฌ๊ท -E, [D, B]
์ผ์ชฝ ์์ ์์
๋
ธ๋ E ๊ฐ์ ๋ฐฐ์ด์ ์ถ๊ฐ - [D, B, E]
์ค๋ฅธ์ชฝ ์์ ์์
๋ชจ๋ ํ์ ๋
ธ๋ ์ฒ๋ฆฌ ์๋ฃ
3. ๋
ธ๋ A ๊ฐ์ ๋ฐฐ์ด์ ์ถ๊ฐ - [D, B, E, A]
4. ์ค๋ฅธ์ชฝ ์์ C๋ก ์ด๋, ์ฌ๊ท - C, [D, B, E, A]
์ผ์ชฝ ์์ ์์
๋
ธ๋ C๋ฅผ ๋ฐฐ์ด์ ์ถ๊ฐ
์ค๋ฅธ์ชฝ ์์ ์์
5. ๋ชจ๋ ๋
ธ๋ ์ฒ๋ฆฌ ์๋ฃ
6. ๋ฐฐ์ด ๋ฐํ
์ฝ๋๋ก ์์๋ณด๊ธฐ
function **traverseInOrder**(node, list) {
if (node.left) {
traverseInOrder(node.left, list);
// ์ผ์ชฝ ์์์ด ์๋ค๋ฉด ์ฌ๊ท
}
**list.push(node.value)**; // ๋ฐฉ๋ฌธ
if (node.right) {
traverseInOrder(node.right, list);
// ์ค๋ฅธ์ชฝ ์์์ด ์๋ค๋ฉด ์ฌ๊ท
}
return list;
}
๐ ์ด์ง ํธ๋ฆฌ ์ฉ์ด ๐ค
ํ์ฌ ๋ ธ๋: ํ์ฌ ์ฒ๋ฆฌ ์ค์ธ ๋ ธ๋
์ฌ๊ท ํธ์ถ: ์ผ์ชฝ ์์์ด ์๋ ๊ฒฝ์ฐ ํด๋น ์์ ๋ ธ๋์ ๋ํด
traverseInOrder
ํจ์๋ฅผ ์ฌ๊ท์ ์ผ๋ก ํธ์ถํฉ๋๋ค. ์ฌ๊ท ํธ์ถ์ด ์๋ ๊ฒฝ์ฐ๋ ๋ค์ ๋จ๊ณ๋ก ์งํํฉ๋๋ค.์ฒ๋ฆฌ๋ ๊ฐ: ํ์ฌ ๋ ธ๋์์ ์ฒ๋ฆฌ๋ ๊ฐ์ด ์์ ๊ฒฝ์ฐ ํด๋น ๊ฐ์ ํ์ํฉ๋๋ค. ๋ณดํต์ ์ฌ๊ท ํธ์ถ์ด ์๋ฃ๋ ํ์ ๊ฐ์ ์ฒ๋ฆฌํฉ๋๋ค.
๊ฒฐ๊ณผ ๋ฆฌ์คํธ: ํ์ฌ๊น์ง ์ฒ๋ฆฌ๋ ๊ฐ๋ค์ด ๋ชจ์ธ ๋ฆฌ์คํธ๋ฅผ ๋ํ๋ ๋๋ค. ๊ฐ ๋จ๊ณ์์ ์ฒ๋ฆฌ๋ ๊ฐ์ ๊ฒฐ๊ณผ ๋ฆฌ์คํธ์ ์ถ๊ฐํ๊ฑฐ๋ ์กฐ์ํฉ๋๋ค.
2. Preorder, ์ ์ ์ํ
- ๋ฃจํธ โ ์ผ์ชฝ ์๋ธํธ๋ฆฌ โ ์ค๋ฅธ์ชฝ ์๋ธํธ๋ฆฌ
ํธ๋ฆฌ๋ก ์์๋ณด๊ธฐ
A
/ \
B C
/ \
D E
Preorder: A - B - D - E - C
1. ํจ์ ํธ์ถ - A(root), []
2. ๋
ธ๋ A๊ฐ์ ๋ฐฐ์ด์ ์ถ๊ฐ -> [A]
3. ์ผ์ชฝ ์์ B๋ก ์ด๋, ์ฌ๊ท ํธ์ถ - B, [A]
๋
ธ๋ B๊ฐ์ ๋ฐฐ์ด์ ์ถ๊ฐ -> [A, B]
์ผ์ชฝ ์์ D๋ก ์ด๋, ์ฌ๊ท ํธ์ถ - D, [A, B]
๋
ธ๋ D๊ฐ์ ๋ฐฐ์ด์ ์ถ๊ฐ -> [A, B, D]
์ค๋ฅธ์ชฝ ์์ ์์
ํ์ ๋
ธ๋ ์ฒ๋ฆฌ ์๋ฃ
๋
ธ๋ E๋ก ์ด๋, ์ฌ๊ท ํธ์ถ - E, [A, B, D]
๋
ธ๋ E๊ฐ์ ๋ฐฐ์ด์ ์ถ๊ฐ -> [A, B, D, E]
์ผ์ชฝ ์์ ์์
์ค๋ฅธ์ชฝ ์์ ์์
๋ชจ๋ ํ์ ๋
ธ๋ ์ฒ๋ฆฌ ์๋ฃ
4. ๋
ธ๋ C๋ก ์ด๋, ์ฌ๊ท ํธ์ถ - C, [A, B, D, E]
๋
ธ๋ C๊ฐ์ ๋ฐฐ์ด์ ์ถ๊ฐ -> [A, B, D, E, C]
์ผ์ชฝ ์์ ์์
์ค๋ฅธ์ชฝ ์์ ์์
5. ๋ชจ๋ ๋
ธ๋ ์ฒ๋ฆฌ ์๋ฃ
6. ๋ฐฐ์ด ๋ฐํ
์ฝ๋๋ก ์์๋ณด๊ธฐ
function **traversePreOrder**(node, list) {
**list.push(node.value**); // ๋จผ์ ๋ฐฉ๋ฌธ
if (node.left) {
traverseInOrder(node.left, list);
// ์ผ์ชฝ ์์์ด ์๋ค๋ฉด ์ฌ๊ท
}
if (node.right) {
traverseInOrder(node.right, list);
// ์ค๋ฅธ์ชฝ ์์์ด ์๋ค๋ฉด ์ฌ๊ท
}
return list;
}
Postorder, ํ์ ์ํ
- ์ผ์ชฝ ์๋ธํธ๋ฆฌ โ ์ค๋ฅธ์ชฝ ์๋ธํธ๋ฆฌ โ ๋ฃจํธ
ํธ๋ฆฌ๋ก ์์๋ณด๊ธฐ
A
/ \
B C
/ \
D E
Postorder: D - E - B - C - A
1. ํจ์ ํธ์ถ - A(root), []
์ผ์ชฝ ์์ B๋ก ์ด๋, ์ฌ๊ท ํธ์ถ - B, []
์ผ์ชฝ ์์ D๋ก ์ด๋, ์ฌ๊ท ํธ์ถ - D, []
์ผ์ชฝ ์์ ์์
์ค๋ฅธ์ชฝ ์์ ์์
๋
ธ๋ D๊ฐ์ ๋ฐฐ์ด์ ์ถ๊ฐ - [D]
ํ์ ๋
ธ๋ ์์
๋
ธ๋ E๋ก ์ด๋, ์ฌ๊ท ํธ์ถ - E, [D]
์ผ์ชฝ ์์ ์์
์ค๋ฅธ์ชฝ ์์ ์์
๋
ธ๋ E๊ฐ์ ๋ฐฐ์ด์ ์ถ๊ฐ - [D, E]
ํ์ ๋
ธ๋ ์์
2. ๋
ธ๋ B๋ก ์ด๋, ์ฌ๊ท ํธ์ถ - B, [D, E]
์ผ์ชฝ ์์ ์์
์ค๋ฅธ์ชฝ ์์ ์์
๋
ธ๋ B๊ฐ์ ๋ฐฐ์ด์ ์ถ๊ฐ - [D, E, B]
ํ์ ๋
ธ๋ ์์
3. ๋
ธ๋ C๋ก ์ด๋, ์ฌ๊ท ํธ์ถ - C, [D, E, B]
์ผ์ชฝ ์์ ์์
์ค๋ฅธ์ชฝ ์์ ์์
๋
ธ๋ C๊ฐ์ ๋ฐฐ์ด์ ์ถ๊ฐ - [D, E, B, C]
ํ์ ๋
ธ๋ ์์
4. ๋
ธ๋ A๋ก ์ด๋
๋
ธ๋ A๊ฐ์ ๋ฐฐ์ด์ ์ถ๊ฐ - [D, E, B, C, A]
5. ๋ชจ๋ ๋
ธ๋ ์ฒ๋ฆฌ ์๋ฃ
6. ์ต์ข
๊ฒฐ๊ณผ์ธ ๋ฆฌ์คํธ [D, E, B, C, A]๋ฅผ ๋ฐํ
ํธ๋ฆฌ๋ก ์์๋ณด๊ธฐ
function **traversePostOrder**(node, list) {
if (node.left) {
traverseInOrder(node.left, list);
// ์ผ์ชฝ ์์์ด ์๋ค๋ฉด ์ฌ๊ท
}
if (node.right) {
traverseInOrder(node.right, list);
// ์ค๋ฅธ์ชฝ ์์์ด ์๋ค๋ฉด ์ฌ๊ท
}
**list.push(node.value);** // ๋ง์ง๋ง์ผ๋ก ๋ฐฉ๋ฌธ
return list;
}