๐Ÿ“Œ Questions

  1. BST์™€ Binary Tree์— ๋Œ€ํ•ด์„œ ์„ค๋ช…ํ•˜์„ธ์š”. (N์‚ฌ ์ „ํ™”๋ฉด์ ‘)
  2. Tree๊ฐ€ ๋ฌด์—‡์ธ๊ฐ€?
  3. ์ด์ง„๊ฒ€์ƒ‰ํŠธ๋ฆฌ์—์„œ ๊ฒ€์ƒ‰์†๋„๊ฐ€ ๊ฐ€์žฅ ๋Š๋ฆฐ์ผ€์ด์Šค๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์–ด๋–ป๊ฒŒ ์ €์žฅ๋˜์–ด ์žˆ๋Š” ๊ฒฝ์šฐ์ธ๊ฐ€?
  4. ์ตœ์†Œ ์ŠคํŒจ๋‹ ํŠธ๋ฆฌ(Minimum Spanning Tree)์— ๋Œ€ํ•ด์„œ ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”.
  5. AVL ํŠธ๋ฆฌ๋ž€?


Tree์˜ ๊ฐœ๋…

: ๋น„์„ ํ˜• ๊ตฌ์กฐ๋กœ, ์›์†Œ๋“ค ๊ฐ„์— 1:n ๊ด€๊ณ„๋ฅผ ๊ฐ€์ง€๋Š” ์ž๋ฃŒ๊ตฌ์กฐ


๐Ÿ’ก ๋ฐ์ดํ„ฐ๋ฅผ ์–ด๋–ป๊ฒŒ ์‚ฝ์ž…ํ•˜๊ณ  ์‚ญ์ œํ•  ๊ฒƒ์ธ์ง€์— ๋Œ€ํ•ด ๊ด€์‹ฌ์ด ๋งŽ์•˜๋˜ ์„ ํ˜• ์ž๋ฃŒ๊ตฌ์กฐ์— ๋น„ํ•ด ๋น„์„ ํ˜• ์ž๋ฃŒ๊ตฌ์กฐ๋Š” ๋ฐ์ดํ„ฐ์˜ ์‚ฝ์ž…/์‚ญ์ œ๋ณด๋‹ค๋Š” โ€˜ํ‘œํ˜„โ€™์— ํฌ์ปค์Šค๊ฐ€ ๋งž์ถฐ์ ธ์žˆ๋‹ค.
ํŠธ๋ฆฌ๋ฅผ ์ด์šฉํ•ด์„œ ๋ฌด์—‡์ธ๊ฐ€๋ฅผ ์ €์žฅํ•˜๊ณ  ๊บผ๋‚ด๊ธฐ ๋ณด๋‹ค ํŠธ๋ฆฌ๋Š” โ€˜๋ฌด์—‡์ธ๊ฐ€๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ๋„๊ตฌโ€™๋กœ ์ž์ฃผ ์‚ฌ์šฉ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๋“œ๋””์–ด ํ๋ฅผ ๋งˆ์ง€๋ง‰์œผ๋กœ ์„ ํ˜•(linear)์ž๋ฃŒ๊ตฌ์กฐ ๋‚ด์šฉ์ด ๋งˆ๋ฌด๋ฆฌ๋˜๊ณ  ์ด์ œ๋ถ€ํ„ฐ๋Š” ๋น„์„ ํ˜• ์ž๋ฃŒ๊ตฌ์กฐ์— ๋Œ€ํ•œ ๋‚ด์šฉ์ด ์‹œ์ž‘๋œ๋‹ค. ๋น„์„ ํ˜• ์ž๋ฃŒ๊ตฌ์กฐ์˜ ๋Œ€ํ‘œ์ ์ธ ์ž๋ฃŒ๊ตฌ์กฐ๋Š” ๋ฐ”๋กœ ํŠธ๋ฆฌ(Tree)์ž๋ฃŒ๊ตฌ์กฐ๋‹ค.

๊ฐ€๊ณ„๋„๋‚˜ ์กฐ์ง๋„ ๋“ฑ ์„ ํ˜• ์ž๋ฃŒ๊ตฌ์กฐ๋กœ ๊ณ„์ธตํ˜• ๊ตฌ์กฐ๋ฅผ ํ‘œํ˜„ํ•˜๊ธฐ ์–ด๋ ค์šธ ๋•Œ๊ฐ€ ์žˆ๋‹ค. ๊ณ„์ธตํ˜• ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง„ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ์ž๋ฃŒ๊ตฌ์กฐ ํ˜•ํƒœ๊ฐ€ ํŠธ๋ฆฌ์ด๋‹ค.

Tree ๊ตฌ์„ฑ์š”์†Œ


Untitled

  • Node : ํŠธ๋ฆฌ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๊ธฐ๋ณธ ์š”์†Œ (๋ฐ์ดํ„ฐ์™€ ๋‹ค๋ฅธ ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ์— ๋Œ€ํ•œ Branch ์ •๋ณด ํฌํ•จ)
  • Root Node : ํŠธ๋ฆฌ ๋งจ ์œ„์— ์žˆ๋Š” ๋…ธ๋“œ
  • Parent Node : ์–ด๋–ค ๋…ธ๋“œ์˜ ๋‹ค์Œ ๋ ˆ๋ฒจ์— ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ = ๋ถ€๋ชจ๋…ธ๋“œ
  • Child Node : ์–ด๋–ค ๋…ธ๋“œ์˜ ์ƒ์œ„ ๋ ˆ๋ฒจ์— ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ = ์ž์‹๋…ธ๋“œ
  • Ancestor node : ์–ด๋–ค ๋…ธ๋“œ๋ณด๋‹ค ์œ„(๋ฃจํŠธ์ชฝ)์— ์œ„์น˜ํ•œ ๋…ธ๋“œ(์—ฐ๊ฒฐ๋˜ ์žˆ์–ด์•ผ ๋จ) ->ย 10,5๋Š” 6์˜ ์กฐ์ƒ๋…ธ๋“œ / 15๋Š” 6์˜ ์กฐ์ƒ๋…ธ๋“œ๊ฐ€ ์•„๋‹˜.
  • descendant nodeย : ์กฐ์ƒ๋…ธ๋“œ์˜ ์—ญ ->ย H๋Š” F,G,I์˜ ํ›„์†๋…ธ๋“œ.
  • Sibling (Brother Node) : ๋™์ผํ•œ Parent Node๋ฅผ ๊ฐ€์ง„ ๋…ธ๋“œ. = ํ˜•์ œ๋…ธ๋“œ
  • Leaf Node (Terminal Node) : Child Node๊ฐ€ ํ•˜๋‚˜๋„ ์—†๋Š” ๋…ธ๋“œ. = ๋‹จ๋ง๋…ธ๋“œ
  • Level : ์ตœ์ƒ์œ„ ๋…ธ๋“œ๋ฅผ Level 0์œผ๋กœ ํ•˜์˜€์„ ๋•Œ, ํ•˜์œ„ Branch๋กœ ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ์˜ ๊นŠ์ด๋ฅผ ๋‚˜ํƒ€๋ƒ„
  • Depth : ํŠธ๋ฆฌ์—์„œ Node๊ฐ€ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ Level
  • Sub Tree : ์–ด๋–ค ๋…ธ๋“œ๋ฅผ ๋ฃจํŠธ๋กœ ํ•˜๊ณ  ๊ทธ ์ž์†์œผ๋กœ ๊ตฌ์„ฑ๋œ ํŠธ๋ฆฌ
  • Null Tree : ๋…ธ๋“œ์™€ ๊ฐ€์ง€๊ฐ€ ์ „ํ˜€ ์—†๋Š” ํŠธ๋ฆฌ, ๋„ ํŠธ๋ฆฌ๋ผ๊ณ ๋„ ํ•จ

Tree์˜ ํŠน์ง•


  • ๊ทธ๋ž˜ํ”„์˜ ํ•œ ์ข…๋ฅ˜์ด๋‹ค. โ€˜์ตœ์†Œ ์—ฐ๊ฒฐ ํŠธ๋ฆฌโ€™ ๋ผ๊ณ ๋„ ๋ถˆ๋ฆฐ๋‹ค.
  • ํŠธ๋ฆฌ๋Š” ๊ณ„์ธต ๋ชจ๋ธ์ด๋‹ค.
  • ํŠธ๋ฆฌ๋Š” DAG(Directed Acyclic Graphs, ๋ฐฉํ–ฅ์„ฑ์ด ์žˆ๋Š” ๋น„์ˆœํ™˜ ๊ทธ๋ž˜ํ”„)์˜ ํ•œ ์ข…๋ฅ˜์ด๋‹ค.
  • Loop๋‚˜ Circuit์ด ์—†๋‹ค. ๋‹น์—ฐํžˆ Self-loop๋„ ์—†๋‹ค.
  • ๋…ธ๋“œ๊ฐ€ N๊ฐœ์ธ ํŠธ๋ฆฌ๋Š” ํ•ญ์ƒ N-1๊ฐœ์˜ ๊ฐ„์„ ์„ ๊ฐ€์ง„๋‹ค.
  • ๋ฃจํŠธ์—์„œ ์–ด๋–ค ๋…ธ๋“œ๋กœ ๊ฐ€๋Š” ๊ฒฝ๋กœ๋Š” ์œ ์ผํ•˜๋‹ค.
  • ํ•œ ๊ฐœ์˜ ๋ฃจํŠธ ๋…ธ๋“œ๋งŒ์ด ์กด์žฌํ•˜๋ฉฐ ๋ชจ๋“  ์ž์‹ ๋…ธ๋“œ๋Š” ํ•œ ๊ฐœ์˜ ๋ถ€๋ชจ ๋…ธ๋“œ๋งŒ์„ ๊ฐ€์ง„๋‹ค.
  • ์ˆœํšŒ๋Š” Pre-order, In-order ์•„๋‹ˆ๋ฉด Post-order๋กœ ์ด๋ฃจ์–ด์ง„๋‹ค. ์ด 3๊ฐ€์ง€ ๋ชจ๋‘ DFS/BFS์•ˆ์— ์žˆ๋‹ค.
  • ํŠธ๋ฆฌ์˜ ์ข…๋ฅ˜
    • ์ด์ง„ํŠธ๋ฆฌ
    • ์Šค๋ ˆ๋“œ ์ด์ง„ ํŠธ๋ฆฌ
    • ์ตœ์†Œ ์‹ ์žฅ ํŠธ๋ฆฌ
    • ์ด์ง„ํƒ์ƒ‰ํŠธ๋ฆฌ
    • ๊ท ํ˜•ํŠธ๋ฆฌ (AVL Tree, Red Black Tree)
    • ์ด์ง„ ํž™

Binary Tree

: ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ๊ฐ€์žฅ ๋งŽ์ด ์“ฐ์ด๋Š” ํŠธ๋ฆฌ


  • ์ด์ง„ ํŠธ๋ฆฌ๋Š” ๋ชจ๋“  ๋…ธ๋“œ๋“ค์ด ๋‘ ๊ฐœ์˜ ์„œ๋ธŒ ํŠธ๋ฆฌ๋ฅผ ๊ฐ–๋Š” ํŠน๋ณ„ํ•œ ํ˜•ํƒœ์˜ ํŠธ๋ฆฌ์ด๋‹ค.
  • ๊ฐ ๋…ธ๋“œ๊ฐ€ ์ž์‹ ๋…ธ๋“œ๋ฅผ ์ตœ๋Œ€ ๋‘ ๊ฐœ๊นŒ์ง€๋งŒ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ ๋…ธ๋“œ์˜ ์ž์‹ ๋…ธ๋“œ๋ฅผ ์™ผ์ชฝ ์ž์‹ ๋…ธ๋“œ, ์˜ค๋ฅธ์ชฝ ์ž์‹ ๋…ธ๋“œ๋ผ๊ณ  ํ•œ๋‹ค.

Binary Tree์˜ ํŠน์ง•


  • ๋ ˆ๋ฒจ i ์—์„œ์˜ ๋…ธ๋“œ์˜ ์ตœ๋Œ€ ๊ฐœ์ˆ˜ : 2โฑ๊ฐœ
  • ๋†’์ด๊ฐ€ h์ธ ์ด์ง„ ํŠธ๋ฆฌ๊ฐ€ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” ๋…ธ๋“œ์˜ ์ตœ์†Œ ๊ฐœ์ˆ˜ : (h+1)๊ฐœ

                                                                          ์ตœ๋Œ€ ๊ฐœ์ˆ˜ : **2^(h+1)-1**๊ฐœ
    

    Untitled

Binary Tree์˜ ์ข…๋ฅ˜


์ด์ง„ํŠธ๋ฆฌ๋Š” ์ž์‹๋…ธ๋“œ๊ฐ€ ์–ด๋–ป๊ฒŒ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋ƒ์— ๋”ฐ๋ผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด 5๊ฐ€์ง€๋กœย ๊ตฌ๋ถ„๋œ๋‹ค.

โ— Perfect Binary Tree (ํฌํ™” ์ด์ง„ ํŠธ๋ฆฌ)

Untitled

  • ๋ชจ๋“  ๋ ˆ๋ฒจ์˜ ๋…ธ๋“œ๊ฐ€ ํฌํ™” ์ƒํƒœ (left, right ์ž์‹๋…ธ๋“œ๊ฐ€ ๋ชจ๋‘ ์กด์žฌ) ์ด์ง„ ํŠธ๋ฆฌ

  • ๋†’์ด๊ฐ€ h์ผ ๋•Œ ์ตœ๋Œ€์˜ ๋…ธ๋“œ ๊ฐœ์ˆ˜์ธ 2^(h+1)-1๊ฐœ์˜ ๋…ธ๋“œ๋ฅผ ๊ฐ€์ง„๋‹ค.

  • ๋ฃจํŠธ๋ฅผ 1๋ฒˆ์œผ๋กœ ํ•˜์—ฌ 2^(h+1)-1๊นŒ์ง€ ์ •ํ•ด์ง„ ์œ„์น˜์— ๋Œ€ํ•œ ๋…ธ๋“œ ๋ฒˆํ˜ธ๋ฅผ ๊ฐ€์ง„๋‹ค.

โ— Complete Binary Tree (์™„์ „ ์ด์ง„ ํŠธ๋ฆฌ)

Untitled

  • ๋†’์ด๊ฐ€ h์ด๊ณ  ๋…ธ๋“œ ์ˆ˜๊ฐ€ n๊ฐœ์ผ ๋•Œ, ์ • ์ด์ง„ ํŠธ๋ฆฌ์˜ ๋…ธ๋“œ ๋ฒˆํ˜ธ 1~n๋ฒˆ๊นŒ์ง€ ๋นˆ์ž๋ฆฌ๊ฐ€ ์—†๋Š” ์ด์ง„ ํŠธ๋ฆฌ

  • ๋งˆ์ง€๋ง‰ ๋ ˆ๋ฒจ์„ ์ œ์™ธํ•œ ๋‚˜๋จธ์ง€ ๋…ธ๋“œ๊ฐ€ ๊ฝ‰ ์ฐจ ์žˆ์–ด์•ผ ํ•˜๋ฉฐ(๋งˆ์ง€๋ง‰ ๋ ˆ๋ฒจ์„ ์ œ์™ธํ•˜๊ณ  ํฌํ™” ์ด์ง„ ํŠธ๋ฆฌ์ด์–ด์•ผ ํ•˜๋ฉฐ), ๋งˆ์ง€๋ง‰ ๋ ˆ๋ฒจ์˜ ๋…ธ๋“œ๋Š” ์™ผ์ชฝ ๋ถ€ํ„ฐ ์ฐจ์žˆ์–ด์•ผ ํ•œ๋‹ค.

โ— Full Binary Tree (์ • ์ด์ง„ ํŠธ๋ฆฌ) :

Untitled

  • ๋ชจ๋“  ๋ ˆ๋ฒจ์—์„œ ๋…ธ๋“œ๋“ค์ด ๋ชจ๋‘ ์ฑ„์›Œ์ ธ ์žˆ๋Š” ํŠธ๋ฆฌ

= Leaf Node๋ฅผ ์ œ์™ธํ•œ ๋ชจ๋“  ๋…ธ๋“œ์˜ ์ฐจ์ˆ˜๊ฐ€ 2๊ฐœ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ์Œ

  • ํ•ด๋‹น ์ฐจ์ˆ˜์— ๋ช‡ ๊ฐœ์˜ ๋…ธ๋“œ๊ฐ€ ์กด์žฌํ•˜๋Š”์ง€ ๋ฐ”๋กœ ์•Œ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜๋ฅผ ํŒŒ์•…ํ•  ๋•Œ ์šฉ์ดํ•จ

โ— Skewed Binary Tree (ํŽธํ–ฅ ์ด์ง„ ํŠธ๋ฆฌ)

Untitled

  • ๋†’์ด h์— ๋Œ€ํ•œ ์ตœ์†Œ ๊ฐœ์ˆ˜์˜ ๋…ธ๋“œ๋ฅผ ๊ฐ€์ง€๋ฉด์„œ ํ•œ์ชฝ ๋ฐฉํ–ฅ์˜ ์ž์‹ ๋…ธ๋“œ๋งŒ์„ ๊ฐ€์ง„ ์ด์ง„ ํŠธ๋ฆฌ

  • ์™ผ์ชฝ ํŽธํ–ฅ ์ด์ง„ ํŠธ๋ฆฌ, ์˜ค๋ฅธ์ชฝ ํŽธํ–ฅ ์ด์ง„ ํŠธ๋ฆฌ๊ฐ€ ์žˆ์Œ

  • ํŽธํ–ฅ ์ด์ง„ ํŠธ๋ฆฌ๋Š” ๊ฒ€์ƒ‰์— ์„ฑ๋Šฅ ์ด์Šˆ๊ฐ€ ์žˆ์Œ

โ‡’ ์ด๋Ÿฐ ๋ฌธ์ œ์ ์„ ๊ทน๋ณตํ•˜๊ธฐ์œ„ํ•ดย ย ๊ท ํ˜•ํŠธ๋ฆฌ(AVLํŠธ๋ฆฌ,ย ๋ ˆ๋“œ-๋ธ”๋ž™ํŠธ๋ฆฌ) ๊ฐ™์€ ๋ณ€์ข…์ด ์ƒ๊ฒจ๋‚ฌ๋‹ค.

โ— Balanced Binary Tree (๊ท ํ˜• ์ด์ง„ ํŠธ๋ฆฌ) :

Untitled

  • ํŠธ๋ฆฌ์—ย ์‚ฝ์ž…๊ณผ ์‚ญ์ œ๊ฐ€ ์ผ์–ด๋‚˜๋Š” ๊ฒฝ์šฐ์— ์ž๋™์œผ๋กœ ๊ทธ ๋†’์ด(๋ฃจํŠธ์—์„œ๋ถ€ํ„ฐ ๋‚ด๋ ค๊ฐˆ ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ ๋ ˆ๋ฒจ)๋ฅผ ์ž‘๊ฒŒ ์œ ์ง€ํ•˜๋Š”ย ๋…ธ๋“œ๊ธฐ๋ฐ˜ย ์ด์ง„ ํƒ์ƒ‰ ํŠธ๋ฆฌ

  • ์™ผ์ชฝ ๊ทธ๋ฆผ์€ย ๊ท ํ˜•์ด ๋งž์ง€ ์•Š๋Š”(unbalanced) ํŠธ๋ฆฌ

                            : ๋ฃจํŠธ โ†’ ํŠน์ • ๋…ธ๋“œ : ํ‰๊ท  3.27ํšŒ์˜ ๋…ธ๋“œ ์ ‘๊ทผ
    
  • ์˜ค๋ฅธ์ชฝ ๊ทธ๋ฆผ์€ ๋™์ผํ•œ ์ž๋ฃŒ๋ฅผ ์œ ์ง€ํ•˜๋ฉด์„œย ํŠธ๋ฆฌ๋ฅผ ๋†’์ด ๊ท ํ˜•์„ ๋งž์ถ˜ ํ›„์˜ ์ƒํƒœ (๊ท ํ˜•์ด์ง„ํŠธ๋ฆฌ)

                                : ํ‰๊ท  ์ด๋™ ๋น„์šฉ์ด 3.00 ๋…ธ๋“œ ์ ‘๊ทผ(node access)
    
  • AVLํŠธ๋ฆฌ, ๋ ˆ๋“œ-๋ธ”๋ž™ํŠธ๋ฆฌ๊ฐ€ ์žˆ๋‹ค.

Binary Tree์˜ ์ˆœํšŒ


์ˆœ์„œ ํŠธ๋ฆฌ์™€ ๋ฌด์ˆœ์„œ ํŠธ๋ฆฌ

ํŠธ๋ฆฌ๋Š” ํ˜•์ œ ๋…ธ๋“œ์˜ ์ˆœ์„œ ๊ด€๊ณ„๊ฐ€ ์žˆ๋Š”์ง€์— ๋”ฐ๋ผ 2์ข…๋ฅ˜๋กœ ๋ถ„๋ฅ˜๋œ๋‹ค. ํ˜•์ œ ๋…ธ๋“œ์˜ ์ˆœ์„œ ๊ด€๊ณ„๊ฐ€ ์žˆ์œผ๋ฉด ์ˆœ์„œํŠธ๋ฆฌ, ๊ตฌ๋ณ„ํ•˜์ง€ ์•Š์œผ๋ฉด ๋ฌด์ˆœ์„œ ํŠธ๋ฆฌ๋ผ๊ณ  ํ•œ๋‹ค.

์ˆœ์„œ ํŠธ๋ฆฌ์˜ ์ˆœํšŒ

  • ๋„ˆ๋น„ ์šฐ์„  ๊ฒ€์ƒ‰(BFS)

    : ๋‚ฎ์€ ๋ ˆ๋ฒจ๋ถ€ํ„ฐ ์™ผ์ชฝ์—์„œ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ๊ฒ€์ƒ‰ํ•˜๊ณ , ํ•œ ๋ ˆ๋ฒจ์—์„œ ๊ฒ€์ƒ‰์„ ๋งˆ์น˜๋ฉด ๋‹ค์Œ ๋ ˆ๋ฒจ๋กœ ๋‚ด๋ ค๊ฐ€๋Š” ๋ฐฉ๋ฒ•, ์ฆ‰ ๋งจ ์œ„์—์„œ๋ถ€ํ„ฐ ์™ผ์ชฝ์—์„œ ์˜ค๋ฅธ์ชฝ, ์™ผ์ชฝ์—์„œ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ๊ฒ€์ƒ‰ํ•˜๋Š”๋ฒ•

  • ๊นŠ์ด ์šฐ์„  ๊ฒ€์ƒ‰(DFS)

    : ๋ฆฌํ”„์— ๋„๋‹ฌํ•  ๋•Œ๊นŒ์ง€ ์•„๋ž˜์ชฝ์œผ๋กœ ๋‚ด๋ ค๊ฐ€๋ฉด์„œ ๊ฒ€์ƒ‰ํ•˜๋Š” ๊ฒƒ์„ ์šฐ์„ ์œผ๋กœ ํ•˜๋Š” ๋ฐฉ๋ฒ•, ๋ฆฌํ”„์— ๋„๋‹ฌํ•ด์„œ ๋” ์ด์ƒ ๊ฒ€์ƒ‰ํ•  ๊ณณ์ด ์—†์œผ๋ฉด ์ผ๋‹จ ๋ถ€๋ชจ ๋…ธ๋“œ๋กœ ๋Œ์•„๊ฐ€๊ณ  ๊ทธ ๋’ค ๋‹ค์‹œ ์ž์‹ ๋…ธ๋“œ๋กœ ๋‚ด๋ ค๊ฐ„๋‹ค.

    • ์ „์œ„์ˆœํšŒ : ๋…ธ๋“œ ๋ฐฉ๋ฌธ -> ์™ผ์ชฝ ์ž์‹ -> ์˜ค๋ฅธ์ชฝ ์ž์‹
    • ์ค‘์œ„์ˆœํšŒ : ์™ผ์ชฝ ์ž์‹ -> ๋…ธ๋“œ ๋ฐฉ๋ฌธ -> ์˜ค๋ฅธ์ชฝ ์ž์‹
    • ํ›„์œ„์ˆœํšŒ : ์™ผ์ชฝ ์ž์‹ -> ์˜ค๋ฅธ์ชฝ ์ž์‹ -> ๋…ธ๋“œ ๋ฐฉ๋ฌธ

Preorder Traversal (์ „์œ„์ˆœํšŒ)


์ „์œ„ ์ˆœํšŒ๋Š” VLR ์ˆœ์„œ๋กœ ์ˆœํšŒํ•œ๋‹ค.

  1. Vย : ํ˜„์žฌ ๋…ธ๋“œ๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค
  2. Lย : ํ˜„์žฌ ๋…ธ๋“œ ์™ผ์ชฝ ์„œ๋ธŒํŠธ๋ฆฌ๋กœ ์ด๋™ํ•œ๋‹ค
  3. Rย : ํ˜„์žฌ ๋…ธ๋“œ ์˜ค๋ฅธ์ชฝ ์„œ๋ธŒํŠธ๋ฆฌ๋กœ ์ด๋™ํ•œ๋‹ค
def preorderTraversal(self, node):
    print(node, end='')
    if not node.left  == None : self.preorderTraversal(node.left)
    if not node.right == None : self.preorderTraversal(node.right)

ํ•ด๋‹น ๋…ธ๋“œ๋ฅผ ์ถœ๋ ฅํ•˜๊ณ  ์™ผ์ชฝ์œผ๋กœ ์ด๋™ํ•œ๋‹ค. ์™ผ์ชฝ ๋…ธ๋“œ๊ฐ€ ์กด์žฌํ•˜๋ฉด ๊ณ„์†ํ•ด์„œ ์™ผ์ชฝ์œผ๋กœ ์ด๋™ํ•˜์—ฌ ์ถœ๋ ฅํ•˜๊ณ  ์™ผ์ชฝ์ด ๋๋‚˜๋Š” ๋…ธ๋“œ๋ถ€ํ„ฐ ์˜ค๋ฅธ์ชฝ ๋…ธ๋“œ๋ฅผ ์ˆœํšŒํ•œ๋‹ค.

Inorder Traversal (์ค‘์œ„์ˆœํšŒ)


์ค‘์œ„ ์ˆœํšŒ๋Š”ย LVRย ์ˆœ์„œ๋กœ ์ˆœํšŒํ•œ๋‹ค. ์™ผ์ชฝ ์ˆœํšŒ๊ฐ€ ์šฐ์„ ์ด๊ณ  ์ถœ๋ ฅ์ด ์ค‘์•™์— ์œ„์น˜ํ•œ๋‹ค.

def inorderTraversal(self, node):
    if not node.left  == None : self.inorderTraversal(node.left)
    print(node, end='')
    if not node.right == None : self.inorderTraversal(node.right)

Postorder Traversal (ํ›„์œ„์ˆœํšŒ)


ํ›„์œ„ ์ˆœํšŒ๋Š”ย LRV๋กœ ์ˆœํšŒํ•œ๋‹ค. ์ถœ๋ ฅ์ด ๋งˆ์ง€๋ง‰์— ์œ„์น˜ํ•œ๋‹ค.

def postorderTraversal(self, node):
    if not node.left  == None : self.postorderTraversal(node.left)
    if not node.right == None : self.postorderTraversal(node.right)
    print(node, end='')

Untitled

Binary Tree์˜ ํ‘œํ˜„๋ฐฉ๋ฒ•


  • ๋ฐฐ์—ด
    • 1์ฐจ์› ๋ฐฐ์—ด์— ์ €์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•

      Untitled

      • ์™„์ „์ด์ง„ํŠธ๋ฆฌ์˜ ์ˆœ์„œ์™€ ๋™์ผํ•˜๊ฒŒ ์ธ๋ฑ์‹ฑํ•œ๋‹ค.
      • ํŽธ์˜์ƒ ๋ฐฐ์—ด์˜ ์ฒซ ๋ฒˆ์งธ ์š”์†Œ๋Š” ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.

      Untitled

    • ์ด์ง„ ํŠธ๋ฆฌ์˜ ๊ฒฝ์šฐ, 2์ฐจ์› ๋ฐฐ์—ด์— ์ž์‹ ๋…ธ๋“œ๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•

      Untitled

      • ๋ชจ๋“  ํŠธ๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•œ ๊ฒƒ ์•„๋‹˜.

        ์ด์ง„ ํŠธ๋ฆฌ๋Š” ๊ฐ ๋…ธ๋“œ๊ฐ€ ์ตœ๋Œ€ ๋‘ ๊ฐœ์˜ ์ž์‹์„ ๊ฐ–๋Š” ํŠธ๋ฆฌ์ด๊ธฐ ๋•Œ๋ฌธ์— 2์ฐจ์› ๋ฐฐ์—ด๋กœ ๊ฐ€๋Šฅํ•จ

      • A[i][0]์€ ์™ผ์ชฝ ์ž์‹, A[i][1]์€ ์˜ค๋ฅธ์ชฝ ์ž์‹

    • ์žฅ๋‹จ์ 

      ์žฅ์  : ๋…ธ๋“œ์˜ ์œ„์น˜๋ฅผ ์ƒ‰์ธ์— ์˜ํ•ด ์‰ฝ๊ฒŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.

                ๋ฐฐ์—ด์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ–ˆ์„ ๋•Œ ์šฉ์ดํ•œ ํŠธ๋ฆฌ ๊ด€๋ จ ์—ฐ์‚ฐ๋„ ์กด์žฌํ•œ๋‹ค.
      

      ๋‹จ์  : ํŠน์ • ํŠธ๋ฆฌ์—์„œ ๊ธฐ์–ต ๊ณต๊ฐ„ ๋‚ญ๋น„๊ฐ€ ์‹ฌํ•  ์ˆ˜ ์žˆ๋‹ค.

      Untitled

  • ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋กœ ํ‘œํ˜„
    • ์ด์ง„ํŠธ๋ฆฌ๋ฅผ ํ‘œ์‹œํ•˜๋Š” ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ ๋ฐฉ๋ฒ•
    • ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ ๊ธฐ๋ฐ˜์—์„œ๋Š”, ํŠธ๋ฆฌ์˜ ๊ตฌ์กฐ์™€ ๋ฆฌ์ŠคํŠธ์˜ ์—ฐ๊ฒฐ ๊ตฌ์กฐ๊ฐ€ ์ผ์น˜

      โ‡’ ๊ตฌํ˜„๊ณผ ๊ด€๋ จ๋œ ์ง๊ด€์ ์ธ ์ดํ•ด๊ฐ€ ๋” ์ข‹์€ ํŽธ

    • ์™ผ์ชฝ ์ž์‹์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ํฌ์ธํ„ฐ ํ•„๋“œ, ์š”์†Œ ํ•„๋“œ, ์˜ค๋ฅธ์ชฝ ์ž์‹์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ํฌ์ธํ„ฐ ํ•„๋“œ๋ฅผ ํฌํ•จํ•˜๋Š” ๋…ธ๋“œ๋กœ ํ‘œํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•
    • ๋ชจ๋“  ์ด์ง„ ํŠธ๋ฆฌ์˜ ๋…ธ๋“œ๋“ค์€ ๋ฐ์ดํ„ฐํƒ€์ž…์ด binaryTreeNode์ธ ์˜ค๋ธŒ์ œ๋กœ ํ‘œํ˜„๋œ๋‹ค.
    • ํ•„์š”ํ•œ ๊ณต๊ฐ„ : n * sizeof(binaryTreeNode)

    Untitled

    • ์žฅ๋‹จ์ 

      ์žฅ์  : ๊ธฐ์–ต ์žฅ์†Œ๋ฅผ ์ ˆ์•ฝํ•  ์ˆ˜ ์žˆ๊ณ , ๋…ธ๋“œ ์‚ฝ์ž…๊ณผ ์‚ญ์ œ๊ฐ€ ์šฉ์ด

      ๋‹จ์  : ์ด์ง„ ํŠธ๋ฆฌ๊ฐ€ ์•„๋‹Œ ์ผ๋ฐ˜ ํŠธ๋ฆฌ์˜ ๊ฒฝ์šฐ ๊ฐ ๋…ธ๋“œ์˜ ์ฐจ์ˆ˜๋งŒํผ ๊ฐ€๋ณ€์ ์ธ ํฌ์ธํ„ฐ ํ•„๋“œ๋ฅผ ๊ฐ€์ ธ์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ ‘๊ทผ์ƒ์˜ ์–ด๋ ค์›€์ด ์žˆ์Œ

Binary Tree Traversal


Untitled

  • ์ „์œ„ ์ˆœํšŒ (preorder traversal)

    DLR ์ˆœ์„œ๋กœ, ํ˜„์žฌ ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธํ•˜์—ฌ ์ฒ˜๋ฆฌํ•˜๋Š” ์ž‘์—… D๋ฅผ ๊ฐ€์žฅ ๋จผ์ € ์ˆ˜ํ–‰

  • ์ค‘์œ„ ์ˆœํšŒ (inorder traversal)

    LDR ์ˆœ์„œ๋กœ, ํ˜„์žฌ ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธํ•˜์—ฌ ์ฒ˜๋ฆฌํ•˜๋Š” ์ž‘์—… D๋ฅผ ์ž‘์—… L๊ณผ ์ž‘์—… R์˜ ์ค‘๊ฐ„์— ์ˆ˜ํ–‰

  • ํ›„์œ„ ์ˆœํšŒ (postorder traversal)

    LRD ์ˆœ์„œ๋กœ, ํ˜„์žฌ ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธํ•˜์—ฌ ์ฒ˜๋ฆฌํ•˜๋Š” ์ž‘์—… D๋ฅผ ๊ฐ€์žฅ ๋‚˜์ค‘์— ์ˆ˜ํ–‰

Threaded Binary Trees

์Šค๋ ˆ๋“œ ์ด์ง„ ํŠธ๋ฆฌ


                                                               ํ—ค๋“œ ๋…ธ๋“œ๋ฅผ ์ œ์™ธํ•œ ์ด์ง„ ์Šค๋ ˆ๋“œ ํŠธ๋ฆฌ

                                                           ํ—ค๋“œ ๋…ธ๋“œ๋ฅผ ์ œ์™ธํ•œ ์ด์ง„ ์Šค๋ ˆ๋“œ ํŠธ๋ฆฌ
  • n๊ฐœ์˜ ๋…ธ๋“œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์ด์ง„ํŠธ๋ฆฌ์—๋Š” 2n๊ฐœ์˜ ๋งํฌ๊ฐ€ ์กด์žฌ
  • ์ด 2n๊ฐœ์˜ ๋งํฌ ์ค‘ n+1๊ฐœ์˜ ๋งํฌ๊ฐ’์€ null
    • Edge(๊ฐ„์„ ) ์ˆ˜๊ฐ€ n-1๊ฐœ์ด๊ธฐ ๋•Œ๋ฌธ
    • ๋ฃจํŠธ ๋…ธ๋“œ ์ œ์™ธ(- 1), ๋ชจ๋“  ๋…ธ๋“œ(n)๊ฐ€ ๋ถ€๋ชจ ๋…ธ๋“œ๋ฅผ ํ–ฅํ•œ Edge๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Œ
  • n + 1๊ฐœ์˜ ํ• ๋‹น ๊ณต๊ฐ„์ด ์•„๊น๋‹ค๊ณ  ์ƒ๊ฐํ•œ ์‚ฌ๋žŒ๋“ค์ด n + 1๊ฐœ์˜ ๋งํฌ์— ๋‹ค๋ฅธ ์œ ์šฉํ•œ ์ •๋ณด๋ฅผ ์ง‘์–ด ๋„ฃ์ž๊ณ  ์ƒ๊ฐ
  • Null ๋งํฌ๋ฅผ ๋‹ค๋ฅธ ๋…ธ๋“œ์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ๋กœ ๋Œ€์ฒด โ†’ ์Šค๋ ˆ๋“œ(Threads)

    โ€ป ์šด์˜์ฒด์ œ, ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์—์„œ ์ด์•ผ๊ธฐํ•˜๋Š” ์Šค๋ ˆ๋“œ์™€ ์™„์ „ํžˆ ๋‹ค๋ฅธ ๊ฒƒ

  • ์Šค๋ ˆ๋“œ๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ๋Š” ํŠธ๋ฆฌ: ์Šค๋ ˆ๋“œ ์ด์ง„ ํŠธ๋ฆฌ

Threaded Binary Tree์˜ ํŠน์ง•


  • ํŠธ๋ฆฌ์˜ย ๋…ธ๋“œ๋Š” ์ˆœ์„œ๋Œ€๋กœ ์ฑ„์›Œ์ง„๋‹ค.
  • ํŠธ๋ฆฌ์˜ ๋‹ค๋ฅธ ๋…ธ๋“œ์— ๋Œ€ํ•œ thread๋ผ๋Š” ํฌ์ธํ„ฐ๋กœ null ๋งํฌ๋ฅผ ๋ณ€๊ฒฝํ•œ๋‹ค
  • ์ž์‹ ๋…ธ๋“œ์™€ ์—ฐ๊ฒฐ๋˜์ง€ ์•Š๋Š” ๋งํฌ๋Š” ์ค‘์œ„ ์„ ํ–‰์ž (Inorder Predecessor) ๋˜๋Š” ์ค‘์œ„ ํ›„ํ–‰์ž (Inoder Successor)์™€ ์—ฐ๊ฒฐ๋œ๋‹ค.
  • ์ค‘์œ„ ์„ ํ–‰์ž ๋˜๋Š” ์ค‘์œ„ ํ›„ํ–‰์ž๊ฐ€ ์—†๋Š” ๋…ธ๋“œ์˜ ๋งํฌ๋Š”ย ๊ฐ€์ƒ์˜ ๋…ธ๋“œ head๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค.

  • ์žฅ์  : ํŠธ๋ฆฌ ์ „์ฒด์˜ ๋ชจ๋“  ๋งํฌ๋ฅผย ํ™œ์šฉํ•œ๋‹ค.

            ์ค‘์œ„ ์ˆœํšŒ์˜ ํŽธ์˜์„ฑ์ด ์ฆ๋Œ€๋œ๋‹ค**.**
    

Thread์˜ ์ด์šฉ


  • ptr -> leftChild = null์ธ ๊ฒฝ์šฐ, ptr โ†’ left_child๋ฅผ ptr์˜ ์ค‘์œ„ ์„ ํ–‰์ž๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋„๋ก ๋ณ€๊ฒฝ

    • ์ค‘์œ„ ์„ ํ–‰์ž(Inorder Predecessor): ํ•ด๋‹น ๋…ธ๋“œ ๋ฐ”๋กœ ์•ž์— ๋‚˜์˜จ ๋…ธ๋“œ
  • ptr -> rightChild = null์ธ ๊ฒฝ์šฐ, ptr โ†’ right_child๋ฅผ ptr์˜ ์ค‘์œ„ ํ›„์†์ž๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋„๋ก ๋ณ€๊ฒฝ

    • ์ค‘์œ„ ํ›„์†์ž(Inorder Successor): ํ•ด๋‹น ๋…ธ๋“œ ๋ฐ”๋กœ ๋’ค์— ๋‚˜์˜ค๋Š” ๋…ธ๋“œ

head ๋…ธ๋“œ์˜ ํŠน์ง•


  • head ๋…ธ๋“œ์˜ ์™ผ์ชฝ ๋งํฌ๋Š” root ๋…ธ๋“œ๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค. (root ๋…ธ๋“œ๋Š” ์ด์ง„ ํŠธ๋ฆฌ์˜ ์ฒซ๋ฒˆ์งธ ๋…ธ๋“œ์ž…๋‹ˆ๋‹ค.
  • head ๋…ธ๋“œ์˜ ์˜ค๋ฅธ์ชฝ ๋งํฌ๋Š” head, ์ฆ‰, ์ž๊ธฐ ์ž์‹ ์„ ๊ฐ€๋ฆฌํ‚จ๋‹ค.
  • head ๋…ธ๋“œ์— ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ๋Š” ์—†๋‹ค.
  • head๋ฅผ ์ œ์™ธํ•œ ์ด์ง„ ํŠธ๋ฆฌ๋ฅผ ์ค‘์œ„ ์ˆœํšŒ ํ•  ๋•Œ ์ฒซ๋ฒˆ์จฐ ๋…ธ๋“œ์˜ ์™ผ์ชฝ ๋งํฌ์™€ ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ์˜ ์˜ค๋ฅธ์ชฝ ๋งํฌ๋Š” head๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค.

                                     An Empty Threaded Binary Tree

                                 An Empty Threaded Binary Tree

Threaded Binary Tree์˜ ์ค‘์œ„ ์ˆœํšŒ


Untitled

  • ์Šค๋ ˆ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ด์„œ ์–ป๋Š” ์ด๋“: ์ค‘์œ„ ์ˆœํšŒ๋ฅผ ์•„์ฃผ ์‰ฝ๊ฒŒ ์ˆ˜ํ–‰ ๊ฐ€๋Šฅ

Step 1. ์ค‘์œ„ ํ›„์†์ž ์ฐพ๊ธฐ

  • ptr์ด ํ˜„์žฌ ๋…ธ๋“œ๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค๊ณ  ๊ฐ€์ •
  • If ptr โ†’ right_thread == TRUE

    โ‡’ ์ค‘์œ„ ์ˆœํšŒ์—์„œ ptr ๋‹ค์Œ ๋…ธ๋“œ = ptr โ†’ right_child

  • Otherwise

    โ‡’ ptr์˜ right_child๋กœ ๊ฐ„ ๋‹ค์Œ, left_child๋ฅผ ๋”ฐ๋ผ ๊ณ„์† ๋‚ด๋ ค๊ฐ„๋‹ค.

    โ‡’ ์–ธ์ œ๊นŒ์ง€? left_thread == TRUE์ธ ๋…ธ๋“œ๋ฅผ ๋งŒ๋‚  ๋•Œ ๊นŒ์ง€

Step 2. ์ค‘์œ„ ํ›„์†์ž ๋ฐœ๊ฒฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜ : insucc

struct thread_tree *insucc(struct thread_tree *ptr)
{   // ์Šค๋ ˆ๋“œ ์ด์ง„ ํŠธ๋ฆฌ์—์„œ ptr์ด ๊ฐ€๋ฆฌํ‚ค๋Š” ๋…ธ๋“œ์˜ inorder successor return
    struct thread_tree *temp = ptr->right_child;

    if (!ptr->right_thread)        // right_child๊ฐ€ ์ž์‹ ๋…ธ๋“œ์ด๋ฉด
        while (!temp->left_thread) // ์™ผ์ชฝ ๋๊นŒ์ง€ ๊ฐ€์ž
            temp = temp->left_child;

    return temp;
}

Step 3. ์ค‘์œ„ ์ˆœํšŒ ์•Œ๊ณ ๋ฆฌ์ฆ˜ : tinorder

void tinorder(struct thread_tree *tree)
{   // ์Šค๋ ˆ๋“œ ์ด์ง„ ํŠธ๋ฆฌ๋ฅผ ์ค‘์œ„ ์ˆœํšŒ. ํ—ค๋“œ ๋…ธ๋“œ๋ถ€ํ„ฐ ์‹œ์ž‘
    struct thread_tree *temp = tree;

    for ( ; ; )
    {
        temp = insucc(temp);
        if (temp == tree) // ํ•ด๋‹น ๋…ธ๋“œ์˜ ์ค‘์œ„ ํ›„์†์ž๊ฐ€ ํ—ค๋“œ ๋…ธ๋“œ๋ฉด(๋‹ค ๋Œ์•˜์œผ๋ฉด)
            break;

        printf("%3c", temp->data);
    }
}
  • ์ˆœํ™˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์ค‘์œ„ ์ˆœํšŒ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ตฌํ˜„ ๊ฐ€๋Šฅ

    โ‡’ ๋”์šฑ ํšจ์œจ์ ์ธ ์•Œ๊ณ ๋ฆฌ์ฆ˜

  • ์ˆœํ™˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ด์šฉ์‹œ overhead๊ฐ€ ์ปค์ง

Threaded Binary Tree์—์„œ Node ์ถ”๊ฐ€ํ•˜๊ธฐ


์ƒˆ๋กœ์šด ๋…ธ๋“œ๋ฅผ parent ๋…ธ๋“œ์˜ right child ๋กœ ์ถ”๊ฐ€ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณด์ž.

  • Case 1 : parent โ†’ right_thread ๊ฐ’์ด true์ผ ๊ฒฝ์šฐ
  • Case 2 : parent โ†’ right_thread ๊ฐ’์ด false์ผ ๊ฒฝ์šฐ

Case 1 : parentโ†’right_thread == TRUE

Untitled

  • 3๊ฐ€์ง€ ํฌ์ธํ„ฐ ๋ณ€๊ฒฝ์ด ํ•„์š”
    • B์—์„œ D๋กœ ์—ฐ๊ฒฐ๋˜๋Š” ๋งํฌ
    • ์ƒˆ๋กœ ์ถ”๊ฐ€๋œ ๋…ธ๋“œ D์˜ left, right child

Case 2 : parentโ†’right_thread == FALSE

Untitled

  • ์ด๋ฏธ ๊ธฐ์กด ๋…ธ๋“œ๊ฐ€ ์˜ค๋ฅธ์ชฝ ์ž์‹์œผ๋กœ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š” ๊ฒฝ์šฐ

    โ†’ ๊ธฐ์กด ๋…ธ๋“œ์˜ ์ค‘์œ„ ํ›„์†์ž์˜ ์ค‘์œ„ ์„ ํ–‰์ž๊นŒ์ง€ ๋ฐ”๊ฟ”์•ผ (์ด 4๊ฐ€์ง€ ํฌ์ธํ„ฐ)

์˜ค๋ฅธ์ชฝ์— ์ถ”๊ฐ€ํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜

void insert_right(struct thread_tree *parent, struct thread_tree *child)
{   // ์Šค๋ ˆ๋“œ ์ด์ง„ ํŠธ๋ฆฌ์—์„œ parent ์˜ค๋ฅธ์ชฝ์— child ์ถ”๊ฐ€
    struct thread_tree *temp;

    child->right_child = parent->right_child;   // child์˜
    child->right_thread = parent->right_thread; // ์ •๋ณด๋ถ€ํ„ฐ
    child->left_child = parent;                 // ๋ณ€๊ฒฝ
    child->left_thread = TRUE;                  // ํ•˜์ž

    parent->right_child = child;
    parent->right_thread = FALSE; // child๊ฐ€ ์กด์žฌํ•˜๋ฏ€๋กœ thread๋Š” false
    if (!child->right_thread)
    {
        temp = insucc(child);     // parent์˜ ์›๋ž˜ successor๋ฅผ ์ฐพ์•„์„œ
        temp->left_child = child; // ์ƒˆ๋กœ์šด predecessor๋กœ ๋ณ€๊ฒฝ
    }
}