hugDog
Android DevLog
hugDog
전체 방문자
였늘
μ–΄μ œ
  • πŸ™Œ Hello? (162)
    • πŸ§©μ•ˆλ“œλ‘œμ΄λ“œ (12)
      • κ°œλ… 정리 (5)
      • 버그 ν•΄κ²° (4)
      • 기타 (3)
    • πŸ”μ•Œκ³ λ¦¬μ¦˜ (54)
      • κ°œλ… (0)
      • λ°±μ€€ (48)
      • ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ (6)
    • πŸ“„κ°œλ°œ 일지 (0)
      • FINPO (0)
    • πŸ”€ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄ (71)
      • C++ 정리 (49)
      • C++κΈ°μ΄ˆν”ŒλŸ¬μŠ€ μ—°μŠ΅λ¬Έμ œ (20)
      • Kotlin (2)
    • ⭐Project (1)
    • 🚴TIL (13)
      • Clean Code (13)
    • πŸš©κΈ°νƒ€ (9)
      • λͺ©ν‘œ (6)
      • 일상 (3)
      • λ¬Έμ„œ (0)

인기 κΈ€

졜근 λŒ“κΈ€

졜근 κΈ€

ν‹°μŠ€ν† λ¦¬

hELLO Β· Designed By μ •μƒμš°.
hugDog

Android DevLog

[Python/파이썬] λ°±μ€€ 2263번: 트리의 순회
πŸ”μ•Œκ³ λ¦¬μ¦˜/λ°±μ€€

[Python/파이썬] λ°±μ€€ 2263번: 트리의 순회

2021. 12. 27. 15:34
728x90

문제

 

풀이

μ€‘μœ„ μˆœνšŒ : 7 3 8 1 9 4 10 0 11 5 2 6
ν›„μœ„ μˆœνšŒ : 7 8 3 9 10 4 1 11 5 6 2 0

 

ν›„μœ„ μˆœνšŒλŠ” μ΅œμƒμœ„ 루트λ₯Ό 맨 λ§ˆμ§€λ§‰μ— λ°©λ¬Έν•˜λ©°,

μ€‘μœ„ μˆœνšŒλŠ” μ™Όμͺ½ μ„œλΈŒ 트리, 루트, 였λ₯Έμͺ½ μ„œλΈŒ 트리 순으둜 λ°©λ¬Έν•œλ‹€.

 

λ”°λΌμ„œ, ν›„μœ„ 순회의 맨 λ§ˆμ§€λ§‰ μ›μ†ŒλŠ” μ΅œμƒμœ„ 루트이며

이λ₯Ό κΈ°μ€€μœΌλ‘œ μ€‘μœ„ 순회λ₯Ό λ‚˜λˆ„λ©΄, μ™Όμͺ½μ€ μ™Όμͺ½ μ„œλΈŒ 트리, 였λ₯Έμͺ½μ€ 였λ₯Έμͺ½ μ„œλΈŒ νŠΈλ¦¬μž„μ„ μ•Œ 수 μžˆλ‹€.

 

μ€‘μœ„ μˆœνšŒ : 7 3 8 1 9 4 10 0 11 5 2 6
ν›„μœ„ μˆœνšŒ : 7 8 3 9 10 4 1 11 5 6 2 0

 

μ΄λ•Œ μ€‘μœ„ μˆœνšŒμ—μ„œ μ™Όμͺ½ μ„œλΈŒ 트리의 λ²”μœ„λŠ”

μ‹œμž‘ 인덱슀 ~ (μ‹œμž‘ 인덱슀 + μ™Όμͺ½ μ„œλΈŒ 트리의 λ…Έλ“œ 수 - 1)

 

μ€‘μœ„ μˆœνšŒμ—μ„œ 였λ₯Έμͺ½ μ„œλΈŒ 트리의 λ²”μœ„λŠ”

(끝 인덱슀 - 였λ₯Έμͺ½ μ„œλΈŒ 트리의 수 + 1) ~ 끝 인덱슀

 

ν›„μœ„ μˆœνšŒμ—μ„œ μ™Όμͺ½ μ„œλΈŒ 트리의 λ²”μœ„λŠ”

μ‹œμž‘ 인덱슀 ~ (μ‹œμž‘ 인덱슀 + μ™Όμͺ½ μ„œλΈŒ 트리의 λ…Έλ“œ 수 - 1)

 

ν›„μœ„ μˆœνšŒμ—μ„œ 였λ₯Έμͺ½ μ„œλΈŒ 트리의 λ²”μœ„λŠ”

(끝 인덱슀 - 였λ₯Έμͺ½ μ„œλΈŒ 트리의 수) ~ (끝 인덱슀 - 1)

μ½”λ“œ

import sys
input = sys.stdin.readline
sys.setrecursionlimit(10 ** 5)

n = int(input())
inorder = list(map(int, input().split()))
postorder = list(map(int, input().split()))

nodeNum = [0] * (n + 1)
for i in range(n):
    nodeNum[inorder[i]] = i

def preorder(inStart, inEnd, postStart, postEnd):
    if (inStart > inEnd) or (postStart > postEnd):
        return
    
    root = postorder[postEnd]
    
    leftNode = nodeNum[root] - inStart
    rightNode = inEnd - nodeNum[root]
    
    print(root, end = " ")
    preorder(inStart, inStart + leftNode - 1, postStart, postStart + leftNode - 1)
    preorder(inEnd - rightNode + 1, inEnd, postEnd - rightNode, postEnd - 1)

preorder(0, n - 1, 0, n - 1)

마무리

이전에 ν’€μ—ˆλ˜ 이진 검색 트리(λ°±μ€€ :5639)와 λΉ„μŠ·ν•΄μ„œ 비ꡐ적 μ‰½κ²Œ ν’€μ—ˆλ‹€.

728x90
μ €μž‘μžν‘œμ‹œ λΉ„μ˜λ¦¬ (μƒˆμ°½μ—΄λ¦Ό)
    'πŸ”μ•Œκ³ λ¦¬μ¦˜/λ°±μ€€' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€
    • [Python/파이썬] λ°±μ€€ 11054번: κ°€μž₯ κΈ΄ 바이토닉 λΆ€λΆ„ μˆ˜μ—΄
    • [Python/파이썬] λ°±μ€€ 14002번: κ°€μž₯ κΈ΄ μ¦κ°€ν•˜λŠ” λΆ€λΆ„ μˆ˜μ—΄ 4
    • [Python/파이썬] λ°±μ€€ 9372번: μƒκ·Όμ΄μ˜ μ—¬ν–‰
    • [Python/파이썬] λ°±μ€€ 5639번: 이진 검색 트리
    hugDog
    hugDog
    μ•ˆλ“œλ‘œμ΄λ“œ 곡뢀 쀑인 ν•™μƒμž…λ‹ˆλ‹€!

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