[자료ꡬ쑰] 8κ°• - μŠ€λ ˆλ“œνŠΈλ¦¬

2025. 10. 23. 18:21Β·πŸŽ“λ°©μ†‘ν†΅μ‹ λŒ€ν•™κ΅/πŸ”’μžλ£Œκ΅¬μ‘°

βœ… 1. μŠ€λ ˆλ“œ 트리 κ°œλ…

(1) μŠ€λ ˆλ“œ νŠΈλ¦¬λž€?

[ κΈ°μ‘΄ 이진 트리의 단점 ]

  • 이진 νŠΈλ¦¬: κ° λ…Έλ“œκ°€ λ°μ΄ν„°λ₯Ό μ €μž₯ν•˜κ³  μ΅œλŒ€ λ‘ κ°œμ˜ μžμ‹ λ…Έλ“œλ₯Ό κ°–λŠ” μžλ£Œκ΅¬μ‘°μž„.
  • ( λ˜ν•œ, μΌλ°˜ μ΄μ§„ νŠΈλ¦¬λŠ” μž¬κ·€ λ˜λŠ” μŠ€νƒμ„ μ΄μš©ν•΄ κ΅¬ν˜„을 ν•  μˆ˜ μžˆμŒ. )
  • κΈ°μ‘΄ 이진 νŠΈλ¦¬μ—μ„œ 잎 λ…Έλ“œμ˜ left/right 포인터가 항상 NULL 이기 λ•Œλ¬Έμ— 순회(μ „μœ„, μ€‘μœ„, ν›„μœ„ 방식)λ₯Ό ν•  λ•Œ, μ΄μ „μ˜ λ…Έλ“œλ‘œ λŒμ•„κ°€μ•Ό ν•˜λŠ” κ²½μš°κ°€ μžˆλŠ”λ° μ΄λ•Œ, μž¬κ·€ ν˜ΈμΆœλ§ˆλ‹€ ν•¨μˆ˜ 호좜 μŠ€νƒμ΄ μŒ“μ΄λŠ” 문제점이 λ°œμƒν•¨.
  • μŠ€νƒ μ˜€λ²„ν—€λ“œ: νŠΈλ¦¬κ°€ κΉŠκ±°λ‚˜ λ…Έλ“œ μˆ˜κ°€ λ§Žμ•„μ§€λ©΄ μŠ€νƒ μ˜€λ²„ν”Œλ‘œμš°κ°€ λ°œμƒ ν•  κ°€λŠ₯성이 높아짐.
  • μ‹€ν–‰ 속도: ν•¨μˆ˜ 호좜/볡귀 λΉ„μš©μ΄ λ°˜λ³΅λ˜μ–΄ μ‹€ν–‰ 속도가 느렀질 수 있음.

[ μŠ€λ ˆλ“œ 트리 ]

  • μŠ€λ ˆλ“œ 트리: μœ„μ™€ 같이 이진 트리의 단점을 λ³΄μ™„ν•˜κ³ μž, κΈ°μ‘΄ 이진 트리의 NULL 포인터λ₯Ό ν™œμš©ν•˜μ—¬ 순회 경둜λ₯Ό μ—°κ²°ν•¨μœΌλ‘œμ¨, μŠ€νƒμ΄λ‚˜ μž¬κ·€μ™€ 같이 λ˜λŒμ•„κ°€μ§€ μ•Šκ³  μ—°κ²° 된 ν˜•νƒœλ‘œ λ‹€μŒμœΌλ‘œ λ„˜μ–΄κ°ˆ 수 있게 λ§Œλ“€μ–΄ 놓은 μžλ£Œκ΅¬μ‘°μž„.
  • 즉, μŠ€λ ˆλ“œ 트리의 핡심 λͺ©μ μ€ 순회 μ‹œ μŠ€νƒμ΄λ‚˜ μž¬κ·€ ν˜ΈμΆœμ„ μ‚¬μš©ν•˜μ§€ μ•Šκ³  λ‹€μŒ λ…Έλ“œλ₯Ό μ°Ύμ•„κ°ˆ 수 μžˆλ„λ‘ ν•˜λŠ” κ²ƒμž„.

(2) μŠ€λ ˆλ“œ 트리 κ΅¬ν˜„ μ˜ˆμ‹œ - 포인터 ν•„λ“œ μΆ”κ°€ 방식(덜 일반적인 λ°©μ‹μž„)

  • μŠ€λ ˆλ“œ νŠΈλ¦¬λŠ” 이진 트리 λ…Έλ“œμ— ν•„λ“œλ₯Ό left_thread, right_thread 두 개λ₯Ό μΆ”κ°€ν•¨μœΌλ‘œμ¨, λ‹€μŒ / 이전 순회 λ…Έλ“œλ₯Ό 직접 μΉ΄λ¦¬ν‚€κ²Œ ν•˜λŠ” 방식이닀.

  • left_thread: μ™Όμͺ½ μžμ‹μ΄ 없을 λ•Œ μ€‘μœ„ μˆœνšŒμ—μ„œ 이전 λ…Έλ“œλ₯Ό κ°€λ¦¬ν‚€λŠ” μš©λ„
  • right_thread: 였λ₯Έμͺ½ μžμ‹μ΄ 없을 λ•Œ λ‹€μŒ λ…Έλ“œλ₯Ό κ°€λ¦¬ν‚€λŠ” μš©λ„
  • 이 방식은 κΈ°μ‘΄ 이진 νŠΈλ¦¬μ— 잎 λ…Έλ“œμ˜ left, right ν•„λ“œκ°€ NULL 인 κ²½μš°μ— left_thread, right_thread λ₯Ό μ°Έμ‘°ν•˜κ²Œ ν•¨μœΌλ‘œμ¨, 기쑴의 μŠ€νƒμ— μŒ“μ•„μ„œ λŒμ•„κ°€λŠ” μž¬κ·€ ꡬ쑰λ₯Ό λ‹¨μˆœνžˆ λ‹€μŒμœΌλ‘œ λ„˜μ–΄κ°€λŠ” μˆœν™˜ ꡬ쑰둜 λ°”κΏ€ 수 있음.
  • 이 κ΅¬μ‘°λŠ” μŠ€λ ˆλ“œ νŠΈλ¦¬κ°€ NUL 포인터 곡간 μž¬ν™œμš©μ΄λΌλŠ” 본래의 λͺ©μ μ„ λ‹¬μ„±ν•˜μ§€ λͺ»ν•΄μ„œ 덜 일반적인 방식이됨.
  • μ–΄λ–»κ²Œ 보면 잘λͺ»λœ λ°©μ‹μœΌλ‘œ λ³Ό 수 있으며, 포인터 ν•„λ“œμ˜ μΆ”κ°€λ‘œ λ©”λͺ¨λ¦¬ νš¨μœ¨μ„±μ΄ 크게 λ–¨μ–΄μ§€κ²Œ 됨.

(3) μŠ€λ ˆλ“œ 트리 μ‚¬μš© 이유

[ μŠ€λ ˆλ“œ 트리 μ‚¬μš© 이유 μ˜ˆμ‹œ ]

  • μœ„μ™€ 같이 기쑴의 μ΄μ§„νŠΈλ¦¬λŠ” μ€‘μœ„ 순회의 경우 μ™Όμͺ½ μ„œλΈŒνŠΈλ¦¬λ₯Ό λ‹€ 돌고 λ‚˜λ©΄ λΆ€λͺ¨λ‘œ λ˜λŒμ•„μ™€μ•Όν•˜λŠ” κ΅¬μ‘°μž„.
  • ν•˜μ§€λ§Œ, 트리 κ΅¬μ‘°μ—μ„œλŠ” λΆ€λͺ¨λ‘œ λŒμ•„κ°€λŠ” 포인터가 μ—†κ³  λ‚΄λ €κ°€λŠ” ν¬μΈν„°λ§Œ μ‘΄μž¬ν•¨.
  • κ·Έλž˜μ„œ κΈ°μ‘΄ 이진 νŠΈλ¦¬λŠ” μŠ€νƒμ„ 톡해 μž¬κ·€ ν˜ΈμΆœμ„ ν•˜λŠ” 방식을 μ΄μš©ν•΄μ„œ λ˜λŒμ•„μ™”μ—ˆμŒ.
  • 즉, “λ°©λ¬Έν•˜μ§€ μ•Šκ³  μ§€λ‚˜μ³ 온 λ…Έλ“œλ₯Ό κΈ°μ–΅ν•˜κΈ° μœ„ν•΄ μŠ€νƒμ— μ €μž₯ν•΄μ•Ό ν•˜λŠ” λ²ˆκ±°λ‘œμ›€μ΄ λ°œμƒν•œλ‹€.”λŠ” 단점이 있음.

[ μ€‘μœ„ 순회 μ‹œ κ΅¬ν˜„ 방법 μ˜ˆμ‹œ ]

  • μ™Όμͺ½ μžμ‹μ΄ μ—†λŠ” 경우: κ·Έ μ™Όμͺ½ 링크λ₯Ό μ€‘μœ„ 순회 μ‹œ, μžκΈ°λ³΄λ‹€ 이전 λ…Έλ“œ(predecessor) 둜 μ—°κ²°
  • 였λ₯Έμͺ½ μžμ‹μ΄ μ—†λŠ” 경우: κ·Έ 였λ₯Έμͺ½ 링크λ₯Ό μ€‘μœ„ 순회 μ‹œ, μžκΈ°λ³΄λ‹€ λ‹€μŒ λ…Έλ“œ(successor) 둜 μ—°κ²°
  • μ΄λ ‡κ²Œ ν•˜λ©΄ μ€‘μœ„ μˆœνšŒν•  λ•Œ μŠ€νƒμ΄λ‚˜ μž¬κ·€ 없이도 λ°”λ‘œ λ‹€μŒ λ…Έλ“œλ₯Ό 찾을 수 있음.

(4) μŠ€λ ˆλ“œ 트리 순회

  • μŠ€λ ˆλ“œ: μŠ€λ ˆλ“œ νŠΈλ¦¬μ—μ„œ μŠ€λ ˆλ“œμ˜ μ˜λ―ΈλŠ” 순회 방법에 λ”°λ₯Έ λ°©λ¬Έμˆœμ„œλ₯Ό μœ μ§€ν•˜λŠ” 포인터이닀.
  • μˆœνšŒλŠ” 기쑴의 이진 νŠΈλ¦¬μ™€ λ™μΌν•˜κ²Œ μ „μœ„, μ€‘μœ„, ν›„μœ„ 순회λ₯Ό λŒ€ν‘œμ μœΌλ‘œ μ‚¬μš©ν•¨.
  • κΈ°μ‘΄ 이진 트리: ν•΄λ‹Ή μˆœνšŒμ—μ„œ μŠ€νƒμ„ μ‚¬μš©ν•œ μž¬κ·€ν˜ΈμΆœ
  • μŠ€λ ˆλ“œ 트리: μŠ€λ ˆλ“œ ν•„λ“œλ₯Ό ν™œμš©ν•΄ 순회 방법에 따라 λ°©λ¬Έ μˆœμ„œμ— 맞게 λ‹€μŒμœΌλ‘œ λ„˜μ–΄κ°€λŠ” λ°©μ‹μž„.

βœ… 2. μŠ€λ ˆλ“œ 트리 κ΅¬ν˜„ - 포인터 ν•„λ“œμ˜ μΆ”κ°€ 방식

(1) 포인터 ν•„λ“œμ˜ μΆ”κ°€ λ°©μ‹μ΄λž€?

  • 포인터 ν•„λ“œμ˜ μΆ”κ°€: μŠ€λ ˆλ“œλ₯Ό μ €μž₯ν•˜λŠ” 포인터λ₯Ό μΆ”κ°€ν•˜λŠ” 것을 μ˜λ―Έν•¨.
  • μ™Όμͺ½ μŠ€λ ˆλ“œ 포인터, μ™Όμͺ½ μžμ‹ 포인터, 데이터, 였λ₯Έμͺ½ μžμ‹ 포인터, 였λ₯Έμͺ½ μŠ€λ ˆλ“œ 포인터 ν•„λ“œλ‘œ λ…Έλ“œ ꡬ쑰λ₯Ό μ •μ˜ν•¨.

  • 였λ₯Έμͺ½ μŠ€λ ˆλ“œ: μ •ν•΄μ§„ 순회 μˆœμ„œμ— λ”°λ₯Έ κ·Έ λ…Έλ“œμ˜ 후속 λ…Έλ“œλ₯Ό 가리킴
  • μ™Όμͺ½ μŠ€λ ˆλ“œ: κ·Έ λ…Έλ“œμ˜ μ„ ν–‰ λ…Έλ“œλ₯Ό 가리킴.

(2) 포인터 ν•„λ“œμ˜ μΆ”κ°€ - 객체

  • νŠΉμ • λ…Έλ“œ 객체의 μ •μ˜λ‘œ λ³Ό 수 있으며, μŠ€λ ˆλ“œ νŠΈλ¦¬λŠ” lthread, rthread 두 개의 ν•„λ“œκ°€ μ¦κ°€ν•œ λͺ¨μŠ΅μœΌλ‘œ μ •μ˜ 됨.

(3) 포인터 ν•„λ“œμ˜ μΆ”κ°€ - μ€‘μœ„ 순회 μ—°μ‚°κ³Όμ • 예제

  • μœ„μ˜ μ •μ˜λœ 포인터 ν•„λ“œλ₯Ό ν™œμš©ν•œ μ€‘μœ„ 순회 μ—°μ‚° 과정을 λ‚˜νƒ€λ‚Έ μ½”λ“œμ΄λ‹€.
  • startNode: inoder() ν•¨μˆ˜μ˜ λ§€κ°œλ³€μˆ˜μ˜ κ°’μœΌλ‘œλŠ” μˆœνšŒν•  트리의 μ‹œμž‘ λ…Έλ“œλ₯Ό κ°€λ¦¬ν‚€λŠ” 포인터이닀.
  • tfNode *ptr: λ…Έλ“œλ₯Ό 가리킬 수 μžˆλŠ” νƒ€μž…μΈ tfNode νƒ€μž…μ˜ 포인터 ptr 생성
  • ptr = startNode: μ‹œμž‘ λ…Έλ“œλ₯Ό 가리킀도둝 함.
  • while(ptr != NULL): λ°˜λ³΅λ¬Έμ„ 톡해 ptr 이 NULL 이 μ•„λ‹Œ κ²½μš°μ— 지속적인 λ°˜λ³΅μ„ μš”κ΅¬ν•¨.
  • ptr = ptr -> rthread: ptr μ—λŠ” startNode κ°€ 처음 λ“€μ–΄κ°€ μžˆλŠ” 경우고, 이후에 반볡적으둜 ν•΄λ‹Ή λ…Έλ“œμ˜ rthread 의 ν•„λ“œκ°’μΈ rthread 의 μ£Όμ†Œκ°’μ„ μ°Έμ‘°ν•˜κ²Œ λœλ‹€. 이후, ptr 에 λ„£μ–΄μ£Όκ²Œ 됨.
  • 결과적으둜 μ›ν˜• μ—°κ²° 리슀트처럼 잎 λ…Έλ“œ ν•„λ“œμ— μ£Όμ†Œκ°’μ΄ NULL 이 μ•„λ‹Œ μ£Όμ†Œκ°’μ„ λ„£κ²Œ λ˜μ–΄, μ°Έμ‘°λ₯Ό ν•˜κ²Œλ˜λŠ” λ°©μ‹μž„.

  • 핡심: μ „μœ„, μ€‘μœ„, ν›„μœ„ 순회 μˆœμ„œμ— 따라, μ‹œμž‘ν•˜λŠ” startNode κ°€ 달라 질 수 있음.
  • ( μ „μœ„λ©΄ startNode κ°€ root 인 Cκ°€ 될 κ²ƒμž„. μ€‘μœ„ = startNode L , ν›„μœ„ = startNode L )
  • 일반적인 νŠΈλ¦¬μ—μ„œλŠ” root λ₯Ό μ΄μš©ν•΄ 트리λ₯Ό κ°€λ¦¬ν‚€λŠ”κ²Œ κΈ°λ³Έμ΄μ§€λ§Œ, μŠ€λ ˆλ“œ νŠΈλ¦¬μ—μ„œλŠ” μˆœνšŒμˆœμ„œμ— λ”°λΌμ„œ μ‹œμž‘μ μ΄ 달라짐

(4) 포인터 ν•„λ“œμ˜ μΆ”κ°€ - μŠ€λ ˆλ“œ νŠΈλ¦¬κ°€ λ§žλ‚˜?

  • 이 κ΅¬μ‘°λŠ” μŠ€λ ˆλ“œ νŠΈλ¦¬κ°€ NULL 포인터 곡간 μž¬ν™œμš©μ΄λΌλŠ” 본래의 λͺ©μ μ„ λ‹¬μ„±ν•˜μ§€ λͺ»ν•΄μ„œ 덜 일반적인 방식이됨.
  • μ–΄λ–»κ²Œ 보면 잘λͺ»λœ λ°©μ‹μœΌλ‘œ λ³Ό 수 있으며, 포인터 ν•„λ“œμ˜ μΆ”κ°€λ‘œ λ©”λͺ¨λ¦¬ νš¨μœ¨μ„±μ΄ 크게 λ–¨μ–΄μ§€κ²Œ 됨.
  • 즉, NULL 포인터 곡간을 κ·ΈλŒ€λ‘œ 두고 ν•„λ“œλ₯Ό μΆ”κ°€ν•œ κ²ƒμ΄λ―€λ‘œ, μŠ€λ ˆλ“œ νŠΈλ¦¬μ— λΆ€μ ν•©ν•œ λͺ¨μŠ΅μ„ λ³΄μž„.

(5) 포인터 ν•„λ“œμ˜ μΆ”κ°€ - 핡심

  • νŠΈλ¦¬λŠ” 기본적으둜 λΉ„μ„ ν˜• κ΅¬μ‘°λΌμ„œ, λΆ€λͺ¨μ—μ„œ μžμ‹μœΌλ‘œλŠ” μ‰½κ²Œ λ‚΄λ €κ°ˆ 수 μžˆμ§€λ§Œ λ‹€μ‹œ μ˜¬λΌκ°€λŠ”κ±΄ λΆˆκ°€λŠ₯함.
  • κ·Έλ ‡κΈ° λ•Œλ¬Έμ— λ‚΄λ € 갈 λ•Œ λŒμ•„μ˜¬ μœ„μΉ˜λ₯Ό κΈ°μ–΅ν•΄λ‘˜ ν•„μš”κ°€ 있음 μ΄μœ λŠ”, κ·Έλž˜μ•Ό 순회λ₯Ό 돌 수 μžˆμœΌλ‹ˆκΉŒ
  • κ·Έλž˜μ„œ νŠΈλ¦¬μ—μ„œ 기본적으둜 순회λ₯Ό ν•  λ•Œ μ‚¬μš©ν•˜λŠ” 방법이 μž¬κ·€μ  호좜 방식이고, 이건 Stack 으둜 λ³Ό 수 있음.
  • ν•˜μ§€λ§Œ, μ΄λŸ¬ν•œ μž¬κ·€μ  호좜 λ˜λŠ” μŠ€νƒμ„ μ‚¬μš©ν•˜λŠ” 방식은 ν•¨μˆ˜κ°€ 호좜될 λ•Œλ§ˆλ‹€ μŠ€νƒ ν”„λ ˆμž„(λ§€κ°œλ³€μˆ˜, 볡귀 μ£Όμ†Œ λ“±)을 μ €μž₯ν•΄μ•Ό ν•˜κ³ , λ…Έλ“œ μˆ˜κ°€ 많으면 λ©”λͺ¨λ¦¬ λ‚­λΉ„ + 호좜 λΉ„μš©μ΄ 증가 ν•  수 μžˆλ‹€λŠ” 단점이 있음.
  • 특히 트리의 κΉŠμ΄κ°€ κΉŠμ„μˆ˜λ‘ μ˜€λ²„ν—€λ“œκ°€ λ°œμƒν•  ν™•λ₯ μ΄ 맀우 높아짐 결과적으둜 μŠ€νƒ μ˜€λ²„ν”Œλ‘œμš°κ°€ λ°œμƒν•  수 있음.
  • μ΄λŸ¬ν•œ λ‹€μ–‘ν•œ λ¬Έμ œμ μ„ ν•΄κ²°ν•˜κΈ°μœ„ν•΄ μŠ€λ ˆλ“œνŠΈλ¦¬κ°€ λ‚˜μ˜€κ²Œ λœκ²ƒμž„.
  • 이 μŠ€λ ˆλ“œ νŠΈλ¦¬λŠ”, μŠ€νƒ λ˜λŠ” μž¬κ·€ 없이 트리λ₯Ό μˆœνšŒν•  수 μžˆλ„λ‘ λ§Œλ“  κ΅¬μ‘°μž„.
  • 즉, μŠ€λ ˆλ“œ νŠΈλ¦¬λŠ” 기쑴의 νŠΈλ¦¬κ΅¬μ‘°μ—μ„œ ν•„λ“œλ₯Ό μΆ”κ°€ν•˜μ—¬ μΆ”κ°€μ μœΌλ‘œ λ…Έλ“œμ˜ μ£Όμ†Œλ₯Ό μ €μž₯ν•˜κ²Œ λ˜λŠ” κ²ƒμž„.

  • 였λ₯Έμͺ½ μŠ€λ ˆλ“œ: μ •ν•΄μ§„ 순회 μˆœμ„œμ— λ”°λ₯Έ κ·Έ λ…Έλ“œμ˜ 후속 λ…Έλ“œλ₯Ό 가리킴
  • μ™Όμͺ½ μŠ€λ ˆλ“œ: κ·Έ λ…Έλ“œμ˜ μ„ ν–‰ λ…Έλ“œλ₯Ό 가리킴.
  • μ΄λ ‡κ²Œ κΈ°μ‘΄ λ…Έλ“œ ꡬ쑰에 μŠ€λ ˆλ“œμš© 포인터 ν•„λ“œ 2개λ₯Ό λ§Œλ“€μ–΄μ„œ λ„£κ²Œ 됨.
  • 즉, μŠ€λ ˆλ“œ νŠΈλ¦¬λŠ” μ›ν˜• μ—°κ²° λ¦¬μŠ€νŠΈκ°€ λ‹¨μˆœ μ—°κ²° 리슀트의 ꡬ쑰λ₯Ό ν™œμš©ν•΄μ„œ κ°œμ„ ν•œ 것과 λ™μΌν•˜κ²Œ 트리 ꡬ쑰λ₯Ό κ°œμ„ ν•œ λŠλ‚Œμž„.
  • 결과적으둜 left λ‚˜ right λŠ” 이진 트리의 ꡬ쑰λ₯Ό μœ μ§€ν•˜κΈ° μœ„ν•΄μ„œ ν•„μš”ν•œ 것이고, left_thread 와 right_thread λŠ” 순회 μˆœμ„œμΈ μ „μœ„, μ€‘μœ„, ν›„μœ„μ— λ”°λΌμ„œ μ£Όμ†Œκ°’μ„ λΆ€μ—¬ν•˜λ©΄ λ˜λŠ” κ²ƒμž„.
  • 즉, μ²˜μŒμ—λŠ” left, right λ₯Ό ν†΅ν•΄μ„œ λ‚΄λ €κ°€κ²Œ λ˜λŠ”λ°, λ§Œμ•½ left λ‚˜ right κ°€ null 인 경우 μžμ‹ λ…Έλ“œκ°€ μ—†λŠ” 경우둜 보고, left_thread 와 right_thread λ₯Ό ν†΅ν•΄μ„œ λ‹€μŒ λ…Έλ“œλ‘œ κ°€κ²Œ λ˜λŠ” κ²ƒμž„.
  • left 와 right 의 μ‘΄μž¬λŠ” λ…Έλ“œκ°„μ˜ 관계λ₯Ό λͺ…ν™•ν•˜κ²Œ ν•΄μ£Όκ³  μ‚½μž…κ³Ό μ‚­μ œλ₯Ό ν•˜λŠ” ꡬ쑰적으둜 λ‹€λ£° λ•Œμ— ν•„μš”ν•¨.
  • μ‰½κ²Œλ§ν•΄, left, rightλŠ” μžμ‹ λ…Έλ“œμ˜ μ£Όμ†Œλ₯Ό κ°€μ§€κ³  μžˆμœΌλ―€λ‘œ ν•΄λ‹Ή ꡬ쑰가 νŠΈλ¦¬λΌλŠ” 것을 μ•Œ 수 있게 ν•΄μ£ΌλŠ” ν•„λ“œμž„.
  • 포인터 ν•„λ“œ μΆ”κ°€ 방식은 κ΅¬ν˜„μ΄ μ‰½μ§€λ§Œ λ©”λͺ¨λ¦¬ μ‚¬μš©λŸ‰μ΄ ν•„λ“œμˆ˜ 만큼 λŠ˜μ–΄λ‚˜λŠ” λ‹¨μ μ΄μžˆμŒ.

βœ… 3. μŠ€λ ˆλ“œ 트리 κ΅¬ν˜„ - 빈 포인터 ν™œμš© 방식

  • μŠ€λ ˆλ“œ 트리의 κ΅¬ν˜„ λ°©μ‹μœΌλ‘œ 빈 ν¬μΈν„°μ˜ ν™œμš©μ€ λŒ€ν‘œμ μœΌλ‘œ κ°€μž₯ 많이 μ“°μ΄λŠ” μ§„μ •ν•œ μŠ€λ ˆλ“œ 트리둜 λ³Ό 수 있음.

(1) 빈 포인터 ν™œμš© 방식 μ΄λž€?

  • κΈ°μ‘΄ 이진 트리의 λ…Έλ“œ ꡬ쑰λ₯Ό κ·ΈλŒ€λ‘œ μ‚¬μš©ν•˜λ©΄μ„œ, λ…Έλ“œμ— μžˆλŠ” μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” 포인터(빈 포인터)λ₯Ό ν™œμš©ν•˜λŠ” λ°©λ²•μž„.
  • 좔가적인 λ©”λͺ¨λ¦¬ 곡간을 μ‚¬μš©ν•˜μ§€ μ•Šμ•„λ„ λ˜λŠ” μž₯점이 μžˆμ§€λ§Œ, μ†ŒμŠ€μ½”λ“œκ°€ 많이 λ³΅μž‘ν•΄μ§„λ‹€λŠ” 단점이 있음.
  • 즉, μŠ€λ ˆλ“œ ν•„λ“œλ₯Ό λ”°λ‘œ μΆ”κ°€ν•˜μ§€ μ•ŠμœΌλ―€λ‘œμ¨, 좔가적인 λ©”λͺ¨λ¦¬ 곡간을 μ‚¬μš©ν•˜μ§€ μ•ŠλŠ”λ‹€λŠ” μ˜λ―Έμž„.
  • **νŠΉμ • λ…Έλ“œ X에 λŒ€ν•΄ 였λ₯Έμͺ½ 포인터가 NULL이면 이 포인터λ₯Ό λ…Έλ“œ X의 ν›„ν–‰ λ…Έλ“œλ₯Ό 가리킀도둝 ν•˜λŠ” λ°©μ‹μž„.**

  • μœ„μ™€ 같이 잎 λ…Έλ“œμ˜ 빈 포인터 ν•„λ“œλ₯Ό ν™œμš©ν•˜λŠ” 방식이닀.
  • λ˜ν•œ, λ…Έλ“œ 총 개수: n || null 포인터 총 개수 : n + 1 이닀.
  • 즉, λ…ΈλŠ” 포인터(빈 포인터)κ°€ μ‹€μ œ λ…Έλ“œλ³΄λ‹€ 훨씬 많음.
  • 결과적으둜 null pointer λŠ” μŠ€λ ˆλ“œλ‘œ 뢈리며, 이것을 ν™œμš©ν•˜κ³ μž ν•˜λŠ” 것이 μŠ€λ ˆλ“œ νŠΈλ¦¬μž„.
  • λ˜ν•œ, ν•΄λ‹Ή μŠ€λ ˆλ“œ νŠΈλ¦¬ κ΅¬μ‘°μ—μ„œλŠ” newNode κ°€ μΆ”κ°€κ°€ λ  λ•Œ, μžŽ λ…Έλ“œμ˜ κ²½μš° right ν¬μΈν„°μ— ν›„ν–‰λ…Έλ“œλ₯Ό κ°€λ¦¬ν‚€κ²Œ μ£Όμ†Œκ°’을 μ°Έμ‘°ν•˜λŠ” λ‘œμ§μ΄ ν¬ν•¨μ΄ λ˜μ–΄μ•Ό ν•¨. μ΄λ ‡κ²Œ λ˜λ©΄, μˆœνšŒλŠ” κ°„λ‹¨ν•˜μ§€λ§Œ μ‚½μž…, μˆ˜μ •, μ‚­μ œ λ‘œμ§μ΄ λ³΅μž‘ν•΄μ§ˆ μˆ˜ μžˆμŒ.

(2) 빈 포인터 ν™œμš© 방식 - ꡬ뢄을 μœ„ν•œ νƒœκ·Έ ν•„λ“œ μΆ”κ°€

  • ν•΄λ‹Ή μŠ€λ ˆλ“œ 트리의 빈 포인터가 μŠ€λ ˆλ“œλ‘œ μ‚¬μš© 쀑인지 μ•„λ‹ˆλ©΄ μ„œλΈŒνŠΈλ¦¬μ— λŒ€ν•œ μžμ‹μ„ κ°€λ¦¬ν‚€λŠ” 포인터인지 ꡬ뢄을 ν•΄μ€˜μ•Όν•¨.
  • 즉, μŠ€λ ˆλ“œ μ‚¬μš©μ—¬λΆ€ νƒœκ·Έ ν•„λ“œ(ν”Œλž˜κ·Έ)κ°€ ν•„μš”ν•¨. ( μ‚½μž…/μ‚­μ œ μ—°μ‚°μ—μ„œ λ°˜λ“œμ‹œ ν•„μš”ν•¨ )
  • μ΄μœ λŠ”, μ‚½μž… μ‹œ ν•΄λ‹Ή ν•„λ“œκ°€ μžμ‹μΈμ§€ μŠ€λ ˆλ“œμΈμ§€ λͺ¨λ₯΄λ©΄ λ…Έλ“œ 밑이 μ•„λ‹Œ ν›„ν–‰ λ…Έλ“œλ‘œκ°€μ„œ 넣을 μˆ˜λ„ 있기 λ•Œλ¬Έμž„.

(3) 빈 ν¬μΈν„°μ˜ ν™œμš© 방식 - κ΅¬ν˜„ 방법

[ μ‚¬μš© ν•  순회 방식: μ „μœ„ 순회 방식 ]
[ 쑰건: 각 λ…Έλ“œ 였λ₯Έμͺ½ 포인터 ν•„λ“œλ₯Ό μŠ€λ ˆλ“œλ‘œ μ‚¬μš© ]
( 즉, right = ν›„ν–‰ λ…Έλ“œ or left = ν›„ν–‰ λ…Έλ“œ λ‘˜ 쀑 ν•˜λ‚˜λ‘œ κ΅¬ν˜„ )
  • 이것과 같이 λ‹€μ–‘ν•œ 순회 방식과 λ‹€μ–‘ν•œ 쑰건으둜 κ΅¬ν˜„μ΄ κ°€λŠ₯함.
  • 즉, 였λ₯Έμͺ½ 포인터가 ν›„ν–‰ λ…Έλ“œλ₯Ό κ°€λ¦¬ν‚€κ² λ‹€λŠ” μ˜λ―Έμž„.
  • 점선: ν›„ν–‰ λ…Έλ“œλ₯Ό κ°€λ¦¬ν‚€λŠ” μ„  ( λ…Έλ“œμ˜ μŠ€λ ˆλ“œκ°€ ν›„ν–‰ λ…Έλ“œλ₯Ό 가리킀면 점선 )
  • μ‹€μ„ : μ‹€μ œ μžμ‹μ„ κ°€λ¦¬ν‚€λŠ” μ„  ( λ…Έλ“œμ˜ μŠ€λ ˆλ“œκ°€ μ‹€μ œ μžμ‹μ„ 가리킀면 μ‹€μ„  )
  • **ν•΄λ‹Ή 선은 λ°‘μ˜ 이미지 μ˜ˆμ‹œλ₯Ό μœ„ν•΄μ„œ μ •ν•΄λ‘” μž„μ˜μ˜ κ·œμ •μž„.**

[ μŠ€λ ˆλ“œ ν™œμš© 순회 방법 ]

  • μœ„μ™€ 같이 μŠ€λ ˆλ“œλ₯Ό ν™œμš©ν•΄μ„œ 순회λ₯Ό 돌 수 있으며, ν”Œλž˜κ·Έ ν•„λ“œλ₯Ό λ‹€ μΆ”κ°€λ₯Ό ν•΄μ€˜μ•Όν•¨.

βœ… 4. μŠ€λ ˆλ“œ 트리 순회, μ‚½μž…, μ‚­μ œ

(1) μŠ€λ ˆλ“œ 트리 - 객체

  • 슀레트 트리 λ…Έλ“œμ˜ flag λ₯Ό μΆ”κ°€ν•œ 객체둜 λ³Ό 수 있으며, 이것은 ν•˜λ‚˜μ˜ λ…Έλ“œλ₯Ό μ˜λ―Έν•œλ‹€.
  • threadFlag = true: 일 경우 right μ£Όμ†Œκ°’μ€ ν›„ν–‰ λ…Έλ“œλ₯Ό κ°€λ¦¬ν‚€λŠ” μ£Όμ†Œκ°’μœΌλ‘œ λ³Έλ‹€.
  • threadFlag = false: 일 경우 right μ£Όμ†Œκ°’μ€ μžμ‹ λ…Έλ“œλ₯Ό κ°€λ¦¬ν‚€λŠ” μ£Όμ†Œκ°’μœΌλ‘œ λ³Έλ‹€.
  • μœ„μ™€ 같은 쑰건을 μ•Œκ³ λ¦¬μ¦˜μ—μ„œ κ΅¬ν˜„ν•˜κΈ° μœ„ν•΄μ„œ flag ν•„λ“œλ₯Ό λ”°λ‘œ μΆ”κ°€ν•œ λ°©μ‹μœΌλ‘œ λ³Ό 수 있음.
  • 핡심은 μœ„μ™€ 같은 κ°μ²΄λŠ” μ€‘μœ„ 순회 뿐만 μ•„λ‹ˆλΌ λͺ¨λ“  μˆœνšŒμ— ν•„μš”ν•œ κ°μ²΄μž„. 단지 μ˜ˆμ‹œλ₯Ό λ“  것 μΌλΏμž„.

(2) μŠ€λ ˆλ“œ 트리 - μ€‘μœ„ 순회 μ—°μ‚°

  • (1) inorder(tfNode* root): root λ…Έλ“œμ˜ μ£Όμ†Œκ°’μ„ λ§€κ°œλ³€μˆ˜λ‘œ 전달
  • (2) tfNode* ptr = inorderStart(root): inorderStart() ν•¨μˆ˜ 호좜 λ§€κ°œλ³€μˆ˜λ‘œ root μ£Όμ†Œ 전달
  • (3) inorderStart(): μ€‘μœ„ 순회의 첫 번째 Start Nodeλ₯Ό μ°Ύμ•„μ£ΌλŠ” ν•¨μˆ˜μ΄λ‹€.
  • (4) if(ptr == NULL): ptr 즉, λ„˜κΈ΄ root 의 μ£Όμ†Œκ°’μ΄ NULL 인지 보고 아닐 경우 이후 둜직 μˆ˜ν–‰
  • (5) while(ptr -> left != NULL): λ°˜λ³΅λ¬Έμ„ ν†΅ν•΄μ„œ ptr 객체의 left ν•„λ“œκ°€ κ°€λ¦¬ν‚€λŠ” 값이 NULL 인지 νŒŒμ•…
  • κ·Έν›„, left κ°€ λ§Œμ•½ NULL 인 경우 λ°˜λ³΅λ¬Έμ„ λ‚˜μ™€μ„œ return ptr; NULL 이 μ•„λ‹Œ 경우 계속 반볡
  • 즉, right λ₯Ό ν›„ν–‰ λ…Έλ“œλ₯Ό κ°€λ¦¬ν‚€λŠ” μŠ€λ ˆλ“œλ‘œ μ‚¬μš© ν–ˆμœΌλ―€λ‘œ, left 의 λ§ˆμ§€λ§‰ 뢀뢄은 NULL이 λ“€μ–΄κ°ˆ 수 μžˆμ–΄μ„œ κ°€λŠ₯함.
  • (6) ptr = ptr -> left: left ν•„λ“œκ°€ null 이 μ•„λ‹Œ 경우 left 을 반볡적으둜 μ°Έμ‘°ν•˜κ²Œ 됨.
  • (7) inorderStart()λŠ” μ΅œμ’…μ μœΌλ‘œ leftλ₯Ό μ°Έμ‘°ν•˜λ‹€ 보면, λ§ˆμ§€λ§‰ NULL 인 λΆ€λΆ„μœΌλ‘œ μ€‘μœ„ 순회의 μ‹œμž‘μ μœΌλ‘œ 갈 수 있음.
  • (8) tfNode* ptr = inorderStart(root): ptr μ—λŠ” μ€‘μœ„ 순회 첫 번째 λ…Έλ“œμ˜ μ£Όμ†Œκ°’μ΄ λ“€μ–΄μ˜€κ²Œ 됨.
  • (9) while(ptr != NULL): ptr 첫 번째 λ…Έλ“œμ˜ μ£Όμ†ŒλΆ€ν„° NULL μ—¬λΆ€λ₯Ό 쑰건으둜 μ€‘μœ„ 순회 λ°˜λ³΅λ¬Έμ„ 돌림.
  • (10) if(ptr -> threadFlag): ptr 의 threadFlag κ°€ true 인 경우 ptr = ptr -> right; ptr의 right μ£Όμ†Œκ°’μ„ μ°Έμ‘°ν•΄μ„œ λ‹€μ‹œ ptr에 λ„£μ–΄μ£Όκ²Œ 됨. 즉, flag κ°€ true 인 경우 ν›„ν–‰ λ…Έλ“œλ₯Ό κ°€λ¦¬ν‚€κ²Œ λ§Œλ“œλŠ” μž‘μ—…μž„.
  • (11) ptr = inorderStart(ptr -> right): λ§Œμ•½ flag κ°€ false 인 경우 μžμ‹ λ…Έλ“œλ₯Ό κ°€λ¦¬ν‚€λŠ” λ…Έλ“œμ΄λ―€λ‘œ, inorderStart() ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜λ©΄μ„œ ν˜„μž¬ ptr 의 right ν•„λ“œ μ£Όμ†Œκ°’μ„ μ „λ‹¬ν•˜κ²Œ 됨. 그러면, left λ₯Ό 순회 ν•˜λ©΄μ„œ NULL을 λ§Œλ‚  λ•Œ(잎 λ…Έλ“œ) κΉŒμ§€ 또 μžμ‹ λ…Έλ“œλ₯Ό μˆœνšŒν•˜κ²Œ 됨.

(3) μŠ€λ ˆλ“œ 트리 - μ‚½μž… μ—°μ‚°

(4) μŠ€λ ˆλ“œ 트리 - μ‚­μ œ μ—°μ‚°

'πŸŽ“λ°©μ†‘ν†΅μ‹ λŒ€ν•™κ΅ > πŸ”’μžλ£Œκ΅¬μ‘°' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

[자료ꡬ쑰] 9κ°• - νž™  (0) 2025.11.13
[자료ꡬ쑰] 7κ°• - 트리  (0) 2025.10.14
[자료ꡬ쑰] 6κ°• - μ—°κ²° 리슀트의 μ‘μš©  (0) 2025.10.06
[자료ꡬ쑰] 5κ°• - μ—°κ²° 리슀트  (0) 2025.09.04
[자료ꡬ쑰] 4κ°• - 큐  (0) 2025.09.02
'πŸŽ“λ°©μ†‘ν†΅μ‹ λŒ€ν•™κ΅/πŸ”’μžλ£Œκ΅¬μ‘°' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€
  • [자료ꡬ쑰] 9κ°• - νž™
  • [자료ꡬ쑰] 7κ°• - 트리
  • [자료ꡬ쑰] 6κ°• - μ—°κ²° 리슀트의 μ‘μš©
  • [자료ꡬ쑰] 5κ°• - μ—°κ²° 리슀트
junbin2
junbin2
java.lang.NullPointerException
  • junbin2
    bin's Development Diary
    junbin2
  • 전체
    였늘
    μ–΄μ œ
    • 전체보기 (189)
      • πŸŽ“λ°©μ†‘ν†΅μ‹ λŒ€ν•™κ΅ (49)
        • βš™οΈμ»΄ν“¨ν„°μ˜ 이해 (11)
        • πŸ’»μ»΄ν“¨ν„°κ³Όν•™ 개둠 (14)
        • πŸ”’μžλ£Œκ΅¬μ‘° (9)
        • πŸŒμœ λΉ„μΏΌν„°μŠ€ μ»΄ν“¨νŒ… (11)
        • πŸ›οΈμ„Έκ³„μ˜μ •μΉ˜μ™€κ²½μ œ (3)
        • πŸ–₯️컴퓨터과학과 (1)
      • πŸ› οΈBackend (64)
        • πŸ“šλ°±μ—”λ“œ 곡뢀 (4)
        • β˜•Java (23)
        • 🌳Spring (13)
        • βš™οΈC (8)
        • ⚑Python (13)
        • JavaScript (1)
        • πŸ›’οΈDatabase (0)
        • Algorithm Problem Solving (2)
      • 🌐 Network (7)
        • πŸ“œHTTP (7)
      • πŸš€DevOps (1)
      • β›ΊμŠ€νŒŒλ₯΄νƒ€μ½”λ”©ν΄λŸ½ (64)
      • 정보 (2)
      • 정리가 ν•„μš”ν•œ κΈ€ (2)
  • λΈ”λ‘œκ·Έ 메뉴

    • ν™ˆ
    • νƒœκ·Έ
    • λ°©λͺ…둝
  • 링크

    • GitHub
  • 곡지사항

  • 인기 κΈ€

  • νƒœκ·Έ

    Java
    Cμ–Έμ–΄
    컴파일러
    C μ–Έμ–΄
    λ°©μ†‘λŒ€
    C
    μ»΄ν“¨ν„°μ˜ 이해
    Python
    μœ λΉ„μΏΌν„°μŠ€ μ»΄ν“¨νŒ…κ°œλ‘ 
    컴퓨터과학 개둠
    μž…μΆœλ ₯
    ν•¨μˆ˜
    λ°©μ†‘ν†΅μ‹ λŒ€ν•™κ΅
    자료ꡬ쑰
    μœ λΉ„μΏΌν„°μŠ€
    λ°©ν†΅λŒ€
    μžλ°”
    파이썬
    spring
    λ°°μ—΄
  • 졜근 λŒ“κΈ€

  • 졜근 κΈ€

  • hELLOΒ· Designed Byμ •μƒμš°.v4.10.1
junbin2
[자료ꡬ쑰] 8κ°• - μŠ€λ ˆλ“œνŠΈλ¦¬
μƒλ‹¨μœΌλ‘œ

ν‹°μŠ€ν† λ¦¬νˆ΄λ°”