algorithms-BFS&DFS-02.md

๐Ÿก

Depth First Search/Traversal, ๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰: ์ˆœํšŒ ๋ฐฉ์‹ ์•Œ์•„๋ณด๊ธฐ

๐Ÿ“Ž DFS๋ฅผ ์ง„ํ–‰ํ•˜๋Š” ์„ธ๊ฐ€์ง€ ๋ฐฉ๋ฒ•

  1. inorder: everything in order

  2. preorder: parent node์—์„œ ์‹œ์ž‘, ์ž์‹ (์™ผ์ชฝ โ‡’ ์˜ค๋ฅธ์ชฝ)

  • ํŠธ๋ฆฌ๋ฅผ recreateํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. 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;
}

NextPage