๋ฌธ์

ํ์ด

์ค์ ์ํ : 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)์ ๋น์ทํด์ ๋น๊ต์ ์ฝ๊ฒ ํ์๋ค.