Study/Java

[TIL] ์ž๋ฃŒ๊ตฌ์กฐ : ํŠธ๋ฆฌ, ๊ทธ๋ž˜ํ”„, ์ด์ง„ํƒ์ƒ‰ํŠธ๋ฆฌ

hong- 2022. 5. 29. 09:20

๐Ÿ™Œ๐Ÿป  ํŠธ๋ฆฌ Tree

  - ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฐ”๋กœ ์•„๋ž˜์— ์žˆ๋Š” ํ•˜๋‚˜ ์ด์ƒ์˜ ๋ฐ์ดํ„ฐ์— ๋ฌด๋ฐฉํ–ฅ์œผ๋กœ ์—ฐ๊ฒจ๋œ ๊ณ„์ธต์  ์ž๋ฃŒ๊ตฌ์กฐ

  - ๊ทธ๋ž˜ํ”„ ์ค‘ ๋‹จ๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„๋กœ ํ•˜๋‚˜์˜ ๋ฟŒ๋ฆฌ๋กœ๋ถ€ํ„ฐ ๊ฐ€์ง€๊ฐ€ ์‚ฌ๋ฐฉ์œผ๋กœ ๋ป—์€ ํ˜•ํƒœ

  - ๊ณ„์ธต์ , ๋น„์„ ํ˜•๊ตฌ์กฐ

  - ex) ํŒŒ์ผ ํƒ์ƒ‰๊ธฐ, ๊ฐ€๊ณ„๋„, ์กฐ์ง๋„, ์ถ•๊ตฌ ๋Œ€์ง„ํ‘œ ๋“ฑ

  โ–ช๏ธ ๋ฃจํŠธ Root

   - ํ•˜๋‚˜์˜ ๊ผญ์ง€์  ๋ฐ์ดํ„ฐ๋กœ ๋ฃจํŠธ๋ฅผ ์‹œ์ž‘์œผ๋กœ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ„์„ (edge)๋กœ ์—ฐ๊ฒฐ

  โ–ช๏ธ ๋…ธ๋“œ Node

   - ๊ฐ ๋ฐ์ดํ„ฐ๋ฅผ ๋…ธ๋“œ๋กœ ํ•˜๋ฉฐ ๋‘ ๋…ธ๋“œ๊ฐ€ ์ƒํ•˜๋กœ ์—ฐ๊ฒฐ๋˜๋ฉด ๋ถ€๋ชจ-์ž์‹ ๊ด€๊ณ„๋ฅผ ๊ฐ€์ง

  โ–ช๏ธ ๋ฆฌํ”„ Leaf

   - ํŠธ๋ฆฌ ๊ตฌ์กฐ์˜ ๋ ์ง€์ ์œผ๋กœ ์ž์‹ ๋…ธ๋“œ๊ฐ€ ์—†์Œ


๐Ÿ“ ํŠธ๋ฆฌ ๋ฉ”์„œ๋“œ 

โ‘  addChildNode(value)

  - ์ž…๋ ฅ๋ฐ›์€ value๋ฅผ ๊ณ„์ธต์ ์œผ๋กœ ์ถ”๊ฐ€ 

โ‘ก removeChildNode(node)

  - ์ž…๋ ฅ๋ฐ›์€ ๋…ธ๋“œ๋ฅผ ์‚ญ์ œ

โ‘ข getChildrenNode()

  - ํ˜„์žฌ ํŠธ๋ฆฌ์— ์กด์žฌํ•˜๋Š” children ๋ฆฌํ„ด

โ‘ฃ contains(value)

  - ํŠธ๋ฆฌ์— ํฌํ•จ๋œ ๋ฐ์ดํ„ฐ ์ฐพ๊ธฐ

 


๐Ÿ™Œ๐Ÿป  ๊ทธ๋ž˜ํ”„ Graph

  - ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ ๋“ค์ด ์„œ๋กœ ๋ณต์žกํ•˜๊ฒŒ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š” ๊ด€๊ณ„

  - ex) ํฌํ„ธ์‚ฌ์ดํŠธ ๊ฒ€์ƒ‰์—”์ง„, SNS ์† ์ธ๊ฐ„๊ด€๊ณ„, ๋‚ด๋น„๊ฒŒ์ด์…˜ ๋“ฑ

  - ๊ฐ„์„ ์€ ํŠน์ • ์ •์ ์ด ์ด์–ด์ ธ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค๋งŒ ์•Œ๋ ค์ค„ ๋ฟ ๊ทธ ์™ธ ์ •๋ณด๋Š” ํŒŒ์•…ํ•  ์ˆ˜ ์—†์Œ ( = ๋น„๊ฐ€์ค‘์น˜ ๊ทธ๋ž˜ํ”„ )

  - ๋น„๊ฐ€์ค‘์น˜ ๊ทธ๋ž˜ํ”„์— ๋” ์ž์„ธํ•œ ์ •๋ณด๋ฅผ ๋‹ด์•„ ๊ฐ„์„ ์— ์—ฐ๊ฒฐ ์ •๋„๋ฅผ ํ‘œํ˜„ํ•œ ๊ทธ๋ž˜ํ”„ ( = ๊ฐ€์ค‘์น˜ ๊ทธ๋ž˜ํ”„ )

  - ๋ฌด๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„ ? ๋‚ด๋น„๊ฒŒ์ด์…˜ ์ฒ˜๋Ÿผ ์–‘๋ฐฉํ–ฅ์œผ๋กœ ๊ฐ„์„ ์„ ํ‘œํ˜„ ( ์ผ๋ฐ˜ํ†ตํ–‰๊ณผ ๊ฐ™์€ ๊ฒฝ์šด์€ ๋‹จ๋ฐฉํ–ฅ )

  โ–ช๏ธ  ์ •์  Vertex

   - ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋˜๋Š” ๊ทธ๋ž˜ํ”„์˜ ๊ธฐ๋ณธ ์›์†Œ์ด์ž ๋…ธ๋“œ

  โ–ช๏ธ ๊ฐ„์„  edge

   - ์ •์ ์„ ์ด์–ด์ฃผ๋ฉฐ ์ •์  ๊ฐ„ ๊ด€๊ณ„๋ฅผ ๋‚˜ํƒ€๋ƒ„

  โ–ช๏ธ ์ธ์ ‘ ์ •์  adjacent vertex

   - ํ•˜๋‚˜์˜ ์ •์ ์—์„œ ๊ฐ„์„ ์— ์ง์ ‘ ์—ฐ๊ฒฐ๋œ ์ •์ 

  โ–ช๏ธ ์ง„์ž… ์ฐจ์ˆ˜ / ์ง„์ถœ ์ฐจ์ˆ˜ in-degree / out-degree

   - ํ•œ ์ •์ ์— ์ง„์ž… / ์ง„์ถœํ•˜๋Š” ๊ฐ„์„ ์ด ๋ช‡ ๊ฐœ์ธ์ง€ ๋‚˜ํƒ€๋ƒ„

  โ–ช๏ธ ์ž๊ธฐ ๋ฃจํ”„ self loop

   - ๋‹ค๋ฅธ ์ •์ ์„ ๊ฑฐ์น˜์ง€ ์•Š๊ณ  ๊ฐ„์„ ์ด ์ž๊ธฐ ์ž์‹ ์—๊ฒŒ ์ง„์ž…ํ•  ๋•Œ ์”€

  โ–ช๏ธ ์‚ฌ์ดํด cycle

   - ํ•œ ์ •์ ์—์„œ ์ถœ๋ฐœํ•˜์—ฌ ๋‹ค์‹œ ๊ทธ ์ •์ ์œผ๋กœ ๋Œ์•„๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ


๐Ÿ“ ๊ทธ๋ž˜ํ”„์˜ ํ‘œํ˜„๋ฐฉ์‹

  โ–ช๏ธ ์ธ์ ‘ ํ–‰๋ ฌ

   - ์„œ๋กœ ๋‹ค๋ฅธ ์ •์ ๋“ค์ด ์ธ์ ‘ํ•œ ์ƒํƒœ์ธ์ง€ ํ‘œ์‹œํ•œ 2์ฐจ์› ํ–‰๋ ฌ

   - ๋‘ ์ •์  ์‚ฌ์ด์— ๊ด€๊ณ„๊ฐ€ ์žˆ๋Š”์ง€ ์—†๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ

   - ๊ฐ€์žฅ ๋น ๋ฅธ ๊ฒฝ๋กœ๋ฅผ ์ฐพ๊ณ ์ž ํ•  ๋•Œ ์ฃผ๋กœ ์‚ฌ์šฉ

 

  โ–ช๏ธ ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ

   - ๊ฐ ์ •์ ๋งˆ๋‹ค ์ •์ ์ด ์–ด๋–ค ์ •์ ๊ณผ ์ธ์ ‘ํ•˜๋Š”์ง€ ๋ฆฌ์ŠคํŠธ๋กœ ํ‘œํ˜„

   - ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉ

   - ์—ฐ๊ฒฐ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ์ €์žฅํ•˜์—ฌ ์ƒ๋Œ€์ ์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ ๋งŽ์ด ์ฐจ์ง€


๐Ÿ“ ๊ทธ๋ž˜ํ”„ ๋ฉ”์„œ๋“œ

โ‘  setGraph(size)

  - ๊ทธ๋ž˜ํ”„์— ์‚ฌ์ด์ฆˆ๋งŒํผ ์ •์ ์„ ์ถ”๊ฐ€ํ•ด์•ผ ํ•จ

โ‘ก getGraph()

  - ์ธ์ ‘ ํ–‰๋ ฌ ์ •๋ณด๊ฐ€ ๋‹ด๊ธด ๋ฐฐ์—ด ๋ฐ˜ํ™˜

โ‘ข addEdge(from, to) 

  - from์ •์ ๊ณผ to์ •์  ์‚ฌ์ด์— ๊ฐ„์„ ์„ ์ถ”๊ฐ€

โ‘ฃ hasEdge(from, to)

  - from์ •์ ๊ณผ to์ •์  ์‚ฌ์ด์— ๊ฐ„์„ ์˜ ์กด์žฌ ์—ฌ๋ถ€๋ฅผ true/false๋กœ ๋ฐ˜ํ™˜

โ‘ค removeEdge(from, to)

  - from์ •์ ๊ณผ to์ •์  ์‚ฌ์ด์˜ ๊ฐ„์„  ์‚ญ์ œ


๐Ÿ™Œ๐Ÿป  ์ด์ง„ํƒ์ƒ‰ํŠธ๋ฆฌ Binary Search Tree

๐Ÿ“ ์ด์ง„ ํŠธ๋ฆฌ

 - ์ž์‹ ๋…ธ๋“œ๊ฐ€ ์ตœ๋Œ€ ๋‘ ๊ฐœ์ธ ๋…ธ๋“œ๋“ค๋กœ ๊ตฌ์„ฑ๋œ ํŠธ๋ฆฌ


๐Ÿ“ ์ด์ง„ ํƒ์ƒ‰ ํŠธ๋ฆฌ

 - ๋ชจ๋“  ์™ผ์ชฝ ์ž์‹์˜ ๊ฐ’์ด ๋ฃจํŠธ๋‚˜ ๋ถ€๋ชจ๋ณด๋‹ค ์ž‘๊ณ  ์˜ค๋ฅธ์ชฝ ์ž์‹ ๊ฐ’์€ ๋ฃจํŠธ๋‚˜ ๋ถ€๋ชจ๋ณด๋‹ค ํฐ ๊ฐ’์„ ๊ฐ€์ง


๐Ÿ“ ์ด์ง„ ํƒ์ƒ‰ ํŠธ๋ฆฌ ๋ฉ”์„œ๋“œ

โ‘  insert(value)

  - ์ž…๋ ฅ๋ฐ›์€ ๊ฐ’์„ ๊ณ„์ธต์ ์œผ๋กœ ์ถ”๊ฐ€

โ‘ก contains(value)

  - ํŠธ๋ฆฌ์— ํฌํ•จ๋œ ๊ฐ’ ์ฐพ๊ธฐ

โ‘ข preorder(root, depth, list)

  - ์ „์œ„ ์ˆœํšŒ๋ฅผ ํ†ตํ•ด ํŠธ๋ฆฌ์˜ ๋ชจ๋“  ์š”์†Œ๋ฅผ ์ •๋ ฌํ•˜์—ฌ ArrayList ํƒ€์ž…์œผ๋กœ ๋ฐ˜ํ™˜

โ‘ฃ inorder(root, depth, list)

  -์ค‘์œ„ ์ˆœํšŒ๋ฅผ ํ†ตํ•ด ํŠธ๋ฆฌ์˜ ๋ชจ๋“  ์š”์†Œ๋ฅผ ์ •๋ ฌํ•˜์—ฌ ArrayList ํƒ€์ž…์œผ๋กœ ๋ฐ˜ํ™˜

โ‘ค postorder(root, depth, list)

 - ํ›„์œ„ ์ˆœํšŒ๋ฅผ ํ†ตํ•ด ํŠธ๋ฆฌ์˜ ๋ชจ๋“  ์š”์†Œ๋ฅผ ์ •๋ ฌํ•˜์—ฌ ArrayList ํƒ€์ž…์œผ๋กœ ๋ฐ˜ํ™˜


๐Ÿ’ก์ „์œ„ ์ˆœํšŒ 


๐Ÿ’ก์ค‘์œ„ ์ˆœํšŒ


๐Ÿ’กํ›„์œ„ ์ˆœํšŒ 


๐Ÿ“๊ทธ๋ž˜ํ”„์˜ ๋ชจ๋“  ์ •์  ํƒ์ƒ‰ ๋ฐฉ๋ฒ•

โ‘  ๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰ : BFS(Breathed First Search)

  - ๋„ˆ๋น„๋ฅผ ๊ฐ€์žฅ ์šฐ์„ ์ ์œผ๋กœ ํƒ์ƒ‰ํ•˜๋Š” ๋ฐฉ๋ฒ•

  - ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋ฅผ ์•Œ์•„๋‚ด๋Š” ๊ฒƒ๊ณผ ์œ ์‚ฌ

    (1) ๋ฃจํŠธ์™€ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ์ •์ ๋ถ€ํ„ฐ ํƒ์ƒ‰

    (2) ๋” ์ด์ƒ ํƒ์ƒ‰ํ•  ์ •์ ์ด ์—†์„ ๋•Œ, ๊ทธ ๋‹ค์Œ ๋–จ์–ด์ ธ์žˆ๋Š” ์ •์ ์„ ์ˆœ์„œ๋Œ€๋กœ ๋ฐฉ๋ฌธ

 * ์žฅ์ 
 (1) ๋„ˆ๋น„๋ฅผ ์šฐ์„ ์œผ๋กœ ํƒ์ƒ‰ํ•˜์—ฌ ๋‹ต์ด ๋˜๋Š” ๊ฒฝ๋กœ๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ์ธ ๊ฒฝ์šฐ์—๋„ ์ตœ๋‹จ ๊ฒฝ๋กœ์ž„์„ ๋ณด์žฅ
 (2) ์ตœ๋‹จ ๊ฒฝ๋กœ๊ฐ€ ์กด์žฌํ•œ๋‹ค๋ฉด ์–ด๋А ํ•œ ๊ฒฝ๋กœ๊ฐ€ ๋ฌดํ•œํžˆ ๊นŠ์–ด๋„ ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ์Œ
 (3) ๋…ธ๋“œ ์ˆ˜๊ฐ€ ์ ๊ณ  ๊นŠ์ด๊ฐ€ ์–•์€ ํ•ด๊ฐ€ ์กด์žฌํ•  ๋•Œ ์œ ๋ฆฌ

 * ๋‹จ์ 
 (1) ํ๋ฅผ ์ด์šฉํ•˜์—ฌ ํƒ์ƒ‰ํ•  ๋…ธ๋“œ๋ฅผ ์ €์žฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋…ธ๋“œ๊ฐ€ ๋งŽ์„ ์ˆ˜๋ก ๋” ํฐ ์ €์žฅ ๊ณต๊ฐ„ ํ•„์š”
 (2) ๋…ธ๋“œ ์ˆ˜๊ฐ€ ๋Š˜์–ด๋‚˜๋ฉด ํƒ์ƒ‰ํ•  ๋…ธ๋“œ๊ฐ€ ๋งŽ์•„์ € ๋น„ํšจ์œจ์ 

โ‘ก ๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰ : DFS(Depth First Search)

   - ๊นŠ์ด๋ฅผ ์šฐ์„ ์ ์œผ๋กœ ํƒ์ƒ‰

   - ํ•œ ์ •์ ์—์„œ ์‹œ์ž‘ํ•˜์—ฌ ๋‹ค์Œ ๊ฒฝ๋กœ๋กœ ๋„˜์–ด๊ฐ€๊ธฐ ์ „ ํ•ด๋‹น ๊ฒฝ๋กœ๋ฅผ ์™„๋ฒฝํ•˜๊ฒŒ ํƒ์ƒ‰

   - BFS ๋ณด๋‹ค ํƒ์ƒ‰ ์‹œ๊ฐ„์€ ๊ฑธ๋ฆฌ์ง€๋งŒ ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ์™„์ „ํžˆ ํƒ์ƒ‰ ๊ฐ€๋Šฅ

      (1) ํ•˜๋‚˜์˜ ๊ฒฝ๋กœ๋ฅผ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋๊นŒ์ง€ ํƒ์ƒ‰

      (2) ๋‹ค์Œ ๊ฒฝ๋กœ๋กœ ๋„˜์–ด๊ฐ€ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋๊นŒ์ง€ ํƒ์ƒ‰์„ ๋ฐ˜๋ณต

 * ์žฅ์ 
 (1) BFS์— ๋น„ํ•ด ์ €์žฅ๊ณต๊ฐ„์ด ํ•„์š”์„ฑ์ด ์ ์Œ
 (2) ์ฐพ์•„์•ผ ํ•˜๋Š” ๋…ธ๋“œ๊ฐ€ ๊นŠ์€ ๋‹จ๊ณ„์— ์žˆ์„ ์ˆ˜๋ก, ์ขŒ์ธก์— ์žˆ์„์ˆ˜๋ก BFS๋ณด๋‹ค ์œ ๋ฆฌ
 
 * ๋‹จ์ 
 (1) ๋‹ต์ด ์•„๋‹Œ ๊ฒฝ๋กœ๊ฐ€ ๋งค์šฐ ๊นŠ๋‹ค๋ฉด ๊ทธ ๊ฒฝ๋กœ์— ๊นŠ์ด ๋น ์งˆ ์šฐ๋ ค๊ฐ€ ์žˆ์Œ
 (2) ์ฐพ์€ ํ•ด๊ฐ€ ์ตœ๋‹จ ๊ฒฝ๋กœ๋ผ๋Š” ๋ณด์žฅ์ด ์—†์Œ