Hello Ocean! 🌼

[CS/자료ꡬ쑰] 이진 탐색 트리 (BST) λ³Έλ¬Έ

Algorithm

[CS/자료ꡬ쑰] 이진 탐색 트리 (BST)

bba_dda 2021. 10. 9. 14:09
λ°˜μ‘ν˜•

Binary Search Tree(이진 탐색 트리)λž€?

이진 탐색 + μ—°κ²° 리슀트λ₯Ό κ²°ν•©ν•œ 자료ꡬ쑰의 일쒅

이진 νƒμƒ‰μ˜ 효율적인 탐색 λŠ₯λ ₯ + λΉˆλ²ˆν•œ μ‚½μž…/μ‚­μ œ κ°€λŠ₯ν•˜λ„λ‘ κ³ μ•ˆ

이진 탐색 λ³΅μž‘λ„ : O(logN)

μ—°κ²°λ¦¬μŠ€νŠΈμ˜ μ‚½μž…/μ‚­μ œ λ³΅μž‘λ„ : O(1)

속성

각 λ…Έλ“œμ˜ μ™Όμͺ½ μ„œλΈŒνŠΈλ¦¬μ—λŠ” ν•΄λ‹Ή λ…Έλ“œμ˜ 값보닀 μž‘μ€ 값을 가진 λ…Έλ“œλ“€λ‘œ,

각 λ…Έλ“œμ˜ 였λ₯Έμͺ½ μ„œλΈŒνŠΈλ¦¬μ—λŠ” ν•΄λ‹Ή λ…Έλ“œμ˜ 값보닀 큰 κ°’μ˜ λ…Έλ“œλ“€λ‘œ κ΅¬μ„±λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.

μ€‘λ³΅λ˜λŠ” λ…Έλ“œλŠ” μ—†μ–΄μ•Ό ν•˜λ©°, μ™Όμͺ½ μ„œλΈŒνŠΈλ¦¬, 였λ₯Έμͺ½ μ„œλΈŒνŠΈλ¦¬ λ˜ν•œ μ΄μ§„νƒμƒ‰νŠΈλ¦¬μž…λ‹ˆλ‹€.

μˆœνšŒμ‹œμ—λŠ” μ€‘μœ„μˆœνšŒ 방식을 μ‚¬μš©ν•˜λ©΄, μ΄μ§„νƒμƒ‰νŠΈλ¦¬ λ‚΄μ˜ λͺ¨λ“  값듀을 μ •λ ¬λœ 순으둜 읽을 수 μžˆμŠ΅λ‹ˆλ‹€.

  • μ€‘μœ„ 순회 : μ™Όμͺ½ ν•˜μœ„ 트리 -> root -> 였λ₯Έμͺ½ ν•˜μœ„νŠΈλ¦¬

μ—°μ‚°

검색 / μ‚½μž… / μ‚­μ œ

생성 / μ‚­μ œ / isEmpty / 순회

  • μ‚½μž…O(h)번 탐색 ν›„ μ‚½μž…ν•˜κΈ΄ ν•˜μ§€λ§Œ, μ‚½μž…μ˜ κ³„μ‚°λ³΅μž‘λ„λŠ” O(1)이라 λ¬΄μ‹œν• λ§Œν•˜λ‹€
  • 항상 λ¦¬ν”„λ…Έλ“œμ— μ‚½μž…
  • 검색
  • μ‹œκ°„ λ³΅μž‘λ„ : O(h) (트리의 높이 :h)
  • μ‚­μ œ
    • κ·Έλƒ₯ μ‚­μ œν•˜λ©΄λ¨
      2) μžμ‹λ…Έλ“œκ°€ ν•œ 개인 경우
    • ν•΄λ‹Ή λ…Έλ“œλ₯Ό μ§€μš°κ³ , ν•΄λ‹Ή λ…Έλ“œμ˜ λΆ€λͺ¨μ™€, ν•΄λ‹Ή λ…Έλ“œμ˜ μžμ‹μ„ μ—°κ²°ν•΄μ£Όλ©΄ 됨
      3) μžμ‹λ…Έλ“œκ°€ 두 개인 경우
    • μ™Όμͺ½ μ„œλΈŒνŠΈλ¦¬μ˜ κ°€μž₯ 였λ₯Έμͺ½ λ…Έλ“œ (μ™Όμͺ½ μ„œλΈŒνŠΈλ¦¬μ—μ„œ κ°€μž₯ μž‘μ€ κ°’)
    • 였λ₯Έμͺ½ μ„œλΈŒνŠΈλ¦¬μ˜ κ°€μž₯ μ™Όμͺ½ λ…Έλ“œ (였λ₯Έμͺ½ μ„œλΈŒνŠΈλ¦¬μ—μ„œ κ°€μž₯ 큰 κ°’)
    • 쀑에 μ›ν•˜λŠ” 걸둜 μ‚­μ œν•  λ…Έλ“œλ₯Ό λŒ€μ²΄ν•΄μ£Όλ©΄ λœλ‹€.
  • 1) μžμ‹λ…Έλ“œκ°€ μ—†λŠ” 경우

ν•œκ³„μ 

μ΄μ§„νƒμƒ‰νŠΈλ¦¬ 핡심 연산인 탐색/μ‚½μž…/μ‚­μ œμ˜ λ³΅μž‘λ„λŠ” λͺ¨λ‘ O(h) 둜, 트리의 높이에 따라 μˆ˜ν–‰μ‹œκ°„μ΄ κ²°μ •λ˜λŠ” κ΅¬μ‘°μž…λ‹ˆλ‹€.

κ·Έλž˜μ„œ λͺ¨λ“  λ…Έλ“œκ°€ ν•œ 개의 λ¦¬ν”„λ…Έλ“œλ₯Ό κ°€μ§€λŠ” 트리인 κ²½μš°μ—λŠ” λ…Έλ“œ μˆ˜μ™€, 트리의 높이가 μΌμΉ˜ν•˜κ²Œ λ˜μ–΄ μ—°μ‚°μ˜ μ‹œκ°„ λ³΅μž‘λ„κ°€ O(N)이 되게 λ©λ‹ˆλ‹€.

μ΄λ ‡κ²Œ 되면 λΉ λ₯΄λ‹€κ³  λ³Ό 수 μ—†κΈ° λ•Œλ¬Έμ—, 전체 κ· ν˜•μ„ λ§žμΆ”λŠ” 이진 νƒμƒ‰νŠΈλ¦¬μ˜ 일쒅인 AVL treeκ°€ μ œμ•ˆλ˜μ—ˆμŠ΅λ‹ˆλ‹€.

** AVL트리 정리 μ˜ˆμ •

μš”μ•½

μ΄μ§„νƒμƒ‰νŠΈλ¦¬λž€ 이진탐색과 μ—°κ²°λ¦¬μŠ€νŠΈλ₯Ό κ²°ν•©ν•œ 자료ꡬ쑰의 μΌμ’…μœΌλ‘œ,

효율적인 탐색 및 λΉˆλ²ˆν•œ μ‚½μž…/μ‚­μ œκ°€ κ°€λŠ₯ν•˜λ„λ‘ κ³ μ•ˆλœ μžλ£Œκ΅¬μ‘°μž…λ‹ˆλ‹€.

각 λ…Έλ“œμ˜ μ™Όμͺ½ μ„œλΈŒνŠΈλ¦¬μ—λŠ” ν•΄λ‹Ή λ…Έλ“œμ˜ 값보닀 μž‘μ€ λ…Έλ“œλ“€λ‘œ,

각 λ…Έλ“œμ˜ 였λ₯Έμͺ½ μ„œλΈŒνŠΈλ¦¬μ—λŠ” ν•΄λ‹Ή λ…Έλ“œμ˜ 값보닀 큰 λ…Έλ“œλ“€λ‘œ κ΅¬μ„±λ˜μ–΄ 있고

μ™Όμͺ½ 였λ₯Έμͺ½ μ„œλΈŒνŠΈλ¦¬ λ˜ν•œ λͺ¨λ‘ μ΄μ§„νƒμƒ‰νŠΈλ¦¬μž…λ‹ˆλ‹€.

** O(h) -> O(logn)으둜 ν‘œν˜„

이진 νƒμƒ‰νŠΈλ¦¬μ—μ„œ 탐색 μ‹œκ°„ λ³΅μž‘λ„λŠ” 트리의 높이가 h일 λ•ŒO(h)κ°€ λ©λ‹ˆλ‹€.

μ‚½μž… μ‹œμ—λŠ”, 항상 λ¦¬ν”„λ…Έλ“œμ— μ‚½μž…ν•˜λ©° O(h)번 탐색 ν›„ μ‚½μž…ν•˜κΈ° λ•Œλ¬Έμ— μ‹œκ°„λ³΅μž‘λ„λŠ” 탐색과 λ§ˆμ°¬κ°€μ§€λ‘œ O(h)μž…λ‹ˆλ‹€.

μ‚­μ œλŠ” 크게 μ„Έ 가지 경우둜 ꡬ뢄할 수 μžˆλŠ”λ°

λ¨Όμ € μžμ‹λ…Έλ“œκ°€ μ—†λŠ” κ²½μš°μ—λŠ” κ·Έλƒ₯ μ‚­μ œν•˜λ©΄ 되고

μžμ‹λ…Έλ“œκ°€ ν•œκ°œμΌ κ²½μš°μ—λŠ” μ‚­μ œν•˜λ €λŠ” λ…Έλ“œμ˜ λΆ€λͺ¨μ™€ μžμ‹μ„ μ—°κ²°ν•΄μ£Όκ³  ν•΄λ‹Ή λ…Έλ“œλ₯Ό μ‚­μ œν•˜λ©΄ λ©λ‹ˆλ‹€.

μžμ‹λ…Έλ“œκ°€ 두 개일 κ²½μš°μ—λŠ”,

μ™Όμͺ½ μ„œλΈŒνŠΈλ¦¬μ—μ„œ κ°€μž₯ μž‘μ€κ°’ ν˜Ήμ€ 였λ₯Έμͺ½ μ„œλΈŒνŠΈλ¦¬μ—μ„œ κ°€μž₯ 큰 값을 μ°Ύμ•„

λ‘˜ 쀑에 μ›ν•˜λŠ” λ…Έλ“œλ‘œ μ‚­μ œν•  λ…Έλ“œλ₯Ό λŒ€μ²΄ν•΄μ£Όλ©΄ λ©λ‹ˆλ‹€.

이진 νƒμƒ‰νŠΈλ¦¬μ˜ ν•œκ³„μ μ€, μ€‘μš” μ—°μ‚°λ“€μ˜ μ‹œκ°„λ³΅μž‘λ„κ°€ 트리의 높이와 관련이 있기 λ•Œλ¬Έμ—

λͺ¨λ“  λ…Έλ“œκ°€ ν•œ 개의 λ¦¬ν”„λ…Έλ“œλ₯Ό κ°€μ§€λŠ” κ²½μš°μ—λŠ” λ…Έλ“œμˆ˜μ™€ 트리 높이가 μΌμΉ˜ν•˜κ²Œ λ˜μ–΄ μ‹œκ°„λ³΅μž‘λ„κ°€ O(N)이 λ©λ‹ˆλ‹€.

λ°˜μ‘ν˜•