트리(Tree) 🌲

  • 자주 μ“°λŠ” 자료ꡬ쑰인 리슀트, 큐 λ“±κ³Ό λ‹€λ₯΄κ²Œ, νŠΈλ¦¬λŠ” 계측적인 ν˜•νƒœλ₯Ό λˆλ‹€.

  • 즉 μž…λ ₯ λ°›λŠ” 데이터 κ°„μ˜ μƒν•˜κ΄€κ³„κ°€ μ‘΄μž¬ν•˜λŠ”λ°, μœ„μ— μžˆλŠ” λ…Έλ“œλ₯Ό λΆ€λͺ¨ λ…Έλ“œ, κ·Έ μ•„λž˜μ˜ μ΅œλŒ€ 2개의 λ…Έλ“œλ₯Ό μžμ‹ λ…Έλ“œλΌκ³  λͺ…μΉ­ν•œλ‹€.

(좜처: https://gmlwjd9405.github.io/2018/08/12/data-structure-tree.html)

  1. 루트 λ…Έλ“œ (Root Node)
    • 이름 κ·ΈλŒ€λ‘œ 트리의 뿌리, 즉 트리의 μ‹œμž‘μ μ— μœ„μΉ˜ν•œ λ…Έλ“œλ₯Ό λ§ν•œλ‹€.
  1. λΆ€λͺ¨ λ…Έλ“œ (Parent Node)
    • μžμ‹ λ…Έλ“œμ˜ μœ„μ— μžˆλŠ” λ…Έλ“œλ‘œ, μ΅œλŒ€ 2개의 μžμ‹ λ…Έλ“œλ₯Ό κ±°λŠλ¦°λ‹€.
  1. μžμ‹ λ…Έλ“œ (Child Node)
    • λΆ€λͺ¨ λ…Έλ“œμ˜ μ•„λž˜μ— μœ„μΉ˜ν•˜λŠ” λ…Έλ“œλ₯Ό λ§ν•œλ‹€. 두 μžμ‹ λ…Έλ“œλŠ” ν˜•μ œ(자맀)관계 Siblings 라 λΆ€λ₯Ό 수 μžˆλ‹€.
  1. 리프 λ…Έλ“œ (Leaf Node)
    • λ‚˜λ­‡μžŽμ€ 더 이상 λ‹€λ₯Έ λ‚˜λ¬΄λ‘œ 이어지지 μ•ŠλŠ” κ²ƒμ²˜λŸΌ, μžμ‹ λ…Έλ“œκ°€ μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” λ…Έλ“œλ₯Ό λ§ν•œλ‹€.
  1. λΆ€λΆ„ 트리 (Sub-tree)
    • 전체 트리의 내뢀에 μœ„μΉ˜ν•œ μž‘μ€ ν•˜μœ„ 트리λ₯Ό μΌμ»«λŠ”λ‹€.
  1. 레벨 (깊이)
    • νŠΉμ • λ…Έλ“œκ°€ 루트 λ…Έλ“œλ‘œλΆ€ν„° λ–¨μ–΄μ§„ 정도λ₯Ό λ§ν•œλ‹€.
    • λ ˆλ²¨μ€ 0λΆ€ν„° μ‹œμž‘ν•œλ‹€.
  1. 높이
    • 레벨과 λΉ„μŠ·ν•œ κ°œλ…μ΄μ§€λ§Œ, νŠΉμ • λ…Έλ“œλ₯Ό λŒ€μƒμœΌλ‘œ λ§ν•œλ‹€κΈ°λ³΄λ‹€λŠ” 전체 트리λ₯Ό κΈ°μ€€μœΌλ‘œ 말할 λ•Œ μ‚¬μš©ν•œλ‹€.
    • Ex) μœ„ νŠΈλ¦¬λŠ” 3의 높이λ₯Ό κ°–κ³  μžˆλ‹€.

이진 트리 🌳

  • 이진 νŠΈλ¦¬λž€, 각 λ…Έλ“œκ°€ μ΅œλŒ€ 2개의 μžμ‹λ…Έλ“œλ₯Ό 거느릴 수 μžˆλŠ” νŠΈλ¦¬μ΄λ‹€.

  • 이진 νŠΈλ¦¬λŠ” μ“°μž„μƒˆκ°€ λ‹€μ–‘ν•˜κ³  μš©μ΄ν•΄, 트리λ₯Ό μ‚¬μš©ν•  λ•ŒλŠ” 일반적으둜 이진 트리λ₯Ό μ΄μš©ν•œλ‹€.

μ΄λŸ¬ν•œ 이진 νŠΈλ¦¬μ—λŠ” κ°€μ§„ λͺ¨μ–‘에 따라 3κ°€μ§€μ˜ μ’…λ₯˜λ‘œ λ‚˜λ‰œλ‹€.

1. μ • 이진 트리

(좜처: https://www.wikiwand.com/en/Binary_tree)

  • μ • 이진 νŠΈλ¦¬λŠ” λͺ¨λ“  λ…Έλ“œκ°€ 0개 ν˜Ήμ€ 2개의 μžμ‹ λ…Έλ“œλ₯Ό κ°–κ³  μžˆλŠ” 것을 λ§ν•œλ‹€.

2. 포화 이진 트리

(좜처: https://math.stackexchange.com/questions/2207518/determine-the-depth-and-number-of-node-in-perfect-binary-tree-if-index-number-gi)

  • 포화 이진 νŠΈλ¦¬λŠ” λͺ¨λ“  레벨의 λ…Έλ“œλ“€μ΄ 빠짐없이 μ°¨ μžˆλŠ” ν˜•νƒœλ₯Ό λ§ν•œλ‹€.

3. μ™„μ „ 이진 트리

(좜처: https://www.wikiwand.com/en/Binary_tree)

  • μ™„μ „ 이진 νŠΈλ¦¬λŠ” λ§ˆμ§€λ§‰ λ ˆλ²¨μ„ μ œμ™Έν•œ λͺ¨λ“  λ ˆλ²¨λ“€μ—μ„œλŠ” λ…Έλ“œλ“€μ΄ 꽉 μ°¨ 있으며, λ§ˆμ§€λ§‰ 레벨의 λ…Έλ“œλŠ” μ™Όμͺ½λΆ€ν„° μ°¨λ‘€λŒ€λ‘œ μ±„μ›Œμ§„ ν˜•νƒœλ₯Ό λ§ν•œλ‹€.

  • κ°€μž₯ 많이 μ‚¬μš©λ˜λŠ” λ°©μ‹μœΌλ‘œ, μš°μ„  μˆœμœ„ 큐 λ˜λŠ” νž™ νμ—μ„œλ„ 이와 같은 ν˜•νƒœλ₯Ό μœ μ§€ν•΄μ•Όλ§Œ ν•œλ‹€.

μ™„μ „ 이진 νŠΈλ¦¬λŠ” λ‹€μŒκ³Ό 같은 νŠΉμ§•λ“€μ΄ μ‘΄μž¬ν•œλ‹€.

β‘  전체 λ…Έλ“œμ˜ 개수λ₯Ό ν†΅ν•΄μ„œ 트리의 높이λ₯Ό ꡬ할 수 μžˆλ‹€.

μ™„μ „ 이진 νŠΈλ¦¬λŠ” 각 μΈ΅λ³„λ‘œ μ΅œλŒ€ 2^레벨 만큼의 λ…Έλ“œλ₯Ό κ°–κ³  μžˆλ‹€.

  • 레벨 0: 2^0 = 1개
  • 레벨 3: 2^3 = 8개

κ·ΈλŸ¬λ―€λ‘œ 높이가 3인 μ™„μ „ 이진 νŠΈλ¦¬λŠ” μ΅œλŒ€ 1 + 2 + 4 + 8 = 15개의 λ…Έλ“œλ₯Ό κ°€μ§ˆ 수 μžˆλ‹€.

이와 λΉ„μŠ·ν•œ λ°©μ‹μœΌλ‘œ μ΅œμ†Œ λ…Έλ“œ λ˜ν•œ ꡬ할 수 μžˆλ‹€.
μ΅œμ†Œ λ…Έλ“œλ₯Ό κ°€μ§€κΈ° μœ„ν•΄μ„œλŠ”, λ§ˆμ§€λ§‰ λ ˆλ²¨μ—μ„œ λ…Έλ“œλ₯Ό 1개만 κ°€μ Έμ•Ό ν•œλ‹€.

  • 레벨 1: 2^0 + 1 = 2개
  • 레벨 2: 2^0 + 2^1 + 1 = 4개
  • 레벨 3: 2^0+ 2^1 + 2^2 + 1 = 8개

이λ₯Ό ν†΅ν•΄μ„œ 높이가 3인 μ™„μ „ 이진 트리의 λ…Έλ“œ 개수 λ²”μœ„λŠ” 2^3인 8λΆ€ν„° 2^4 - 1 15κΉŒμ§€μΈ 것을 μ•Œ 수 μžˆλ‹€.

μ΄λŠ” 전체 λ…Έλ“œ κ°œμˆ˜μ— log2()λ₯Ό μ”Œμš΄ 후에 그보닀 μž‘μ€ μ •μˆ˜ 쀑 κ°€μž₯ 큰 값에도 ν•΄λ‹Ήν•œλ‹€.

πŸ‘‰ pythonμ—μ„œλŠ” int(math.log2(15)) 이와 같이 3을 ꡬ할 수 μžˆλ‹€.

πŸ‘‰ 높이가 4인 μ™„μ „ 이진 트리의 전체 λ…Έλ“œ 개수 λ²”μœ„λŠ”?: 2^4인 16개 ~ 2^5 - 1인 31개

πŸ‘‰ μ–΄λ–€ μ™„μ „ 이진 트리의 전체 λ…Έλ“œ κ°œμˆ˜κ°€ 64개라면, 이 트리의 λ†’μ΄λŠ” λͺ‡μΈκ°€?: log2(64) = 6μ΄λ―€λ‘œ λ†’μ΄λŠ” 6

β‘‘ 리프 λ…Έλ“œμ˜ 개수λ₯Ό ν†΅ν•΄μ„œ 트리의 높이λ₯Ό ꡬ할 수 μžˆλ‹€.

리프 λ…Έλ“œμ˜ 개수λ₯Ό κ΅¬ν•œ 후에, log2()λ₯Ό μ”Œμš΄ ν›„ μ˜¬λ¦Όν•˜λ©΄ 높이λ₯Ό ꡬ할 수 μžˆλ‹€.

높이가 2인 κ²½μš°μ— λͺ¨λ“  λ…Έλ“œκ°€ 꽉 μ°¨μžˆλ‹€λ©΄, 리프 λ…Έλ“œλŠ” 4κ°œκ°€ μ‘΄μž¬ν•  것이닀.

μ—¬κΈ°μ„œ κ°€μž₯ μ™Όμͺ½μ˜ λ…Έλ“œμ—μ„œ μžμ‹ λ…Έλ“œκ°€ 2개 생긴닀고 κ°€μ •ν•˜λ©΄, 리프 λ…Έλ“œλŠ” 레벨2μ—μ„œ 3개, 레벨3μ—μ„œ 2κ°œκ°€ μ‘΄μž¬ν•΄ 총 5κ°œκ°€ λœλ‹€.

math.ceil(math.log2(5)) 은 3μ΄λ―€λ‘œ 리프 λ…Έλ“œλ₯Ό 톡해 높이가 3인 것을 μ•Œ 수 μžˆλ‹€.

ν•˜μ§€λ§Œ 이 방법은 νŠΈλ¦¬κ°€ μ • 이진 트리의 ν˜•νƒœμΈ κ²½μš°μ—λ§Œ κ°€λŠ₯ν•˜λ‹€.

πŸ‘‰ λ§Œμ•½ μœ„μ™€ 같은 νŠΈλ¦¬μ—μ„œ μžμ‹ λ…Έλ“œκ°€ 1개만 μƒμ„±λœλ‹€λ©΄, 리프 λ…Έλ“œλŠ” κ·ΈλŒ€λ‘œ 4κ°œκ°€ μ‘΄μž¬ν•˜κ²Œ λ˜λ―€λ‘œ 높이에 λ³€ν™”κ°€ 생기지 μ•ŠκΈ° λ•Œλ¬Έμ΄λ‹€.

β‘’ λΆ€λͺ¨ λ…Έλ“œμ˜ 인덱슀λ₯Ό ν†΅ν•΄μ„œ μžμ‹ λ…Έλ“œμ˜ 인덱슀λ₯Ό ꡬ할 수 μžˆλ‹€.

μ™Όμͺ½ μžμ‹ λ…Έλ“œ 인덱슀 = λΆ€λͺ¨ λ…Έλ“œμ˜ 인덱슀 X 2
였λ₯Έμͺ½ μžμ‹ λ…Έλ“œ 인덱슀 = λΆ€λͺ¨ λ…Έλ“œμ˜ 인덱슀 X 2 + 1

μœ„ 트리λ₯Ό 리슀트둜 λ‚˜νƒ€λ‚΄λ©΄, [None,10,5,15,1,7,12,20]이 λœλ‹€.

  • index 2에 ν•΄λ‹Ήν•˜λŠ” 5λŠ” 1κ³Ό 7을 μžμ‹ λ…Έλ“œλ‘œ κ°–λŠ”λ°, μ΄λŠ” index 4와 index 5에 ν•΄λ‹Ήν•œλ‹€.

πŸ‘‰ μœ„μ˜ 곡식이 성립함을 μ•Œ 수 μžˆλ‹€.

β‘£ μžμ‹ λ…Έλ“œμ˜ 인덱슀λ₯Ό ν†΅ν•΄μ„œ λΆ€λͺ¨ λ…Έλ“œμ˜ 인덱슀λ₯Ό ꡬ할 수 μžˆλ‹€.

λΆ€λͺ¨ λ…Έλ“œ 인덱슀 = μžμ‹ λ…Έλ“œ 인덱슀 // 2

  • index 4에 μœ„μΉ˜ν•œ 1κ³Ό index 5에 μœ„μΉ˜ν•œ 7의 λΆ€λͺ¨ λ…Έλ“œμΈ, 5λŠ” index 2에 μœ„μΉ˜ν•΄μžˆλ‹€.

πŸ‘‰ μœ„μ˜ 곡식이 성립함을 μ•Œ 수 μžˆλ‹€.


μ°Έκ³ ν•œ λΈ”λ‘œκ·Έ

profile
μ•ˆλ…•ν•˜μ„Έμš”. λΉ„μ¦ˆλ‹ˆμŠ€λ₯Ό μ΄ν•΄ν•˜λŠ” λ°±μ—”λ“œ 개발자, ν•œμƒν˜Έμž…λ‹ˆλ‹€.

0개의 λŒ“κΈ€