def recursion(Inorder, Postorder):
if len(Inorder) < 2:
return Inorder
elif Inorder == Postorder:
only_left = list()
while(len(Inorder) != 0):
only_left.append(str(Inorder.pop(-1)))
return only_left
elif len(Inorder) > 2:
Preorder_root = Postorder.pop(-1)
Inorder_index = Inorder.index(Preorder_root)
Postorder_left = Postorder[:Inorder_index]
Postorder_right = Postorder[Inorder_index:]
Inorder_left = Inorder[:Inorder_index]
Inorder_right = Inorder[Inorder_index+1:]
Preorder = recursion(Inorder_left, Postorder_left) + recursion(Inorder_right, Postorder_right)
Preorder.insert(0,Preorder_root)
return Preorder
elif Postorder[-1] == Inorder[0]:
return Inorder
else:
temp = Inorder.pop(1)
Preorder = Inorder
Preorder.insert(0,temp)
return Preorder
n = int(input())
Inorder = list(map(int, input().split(' ')))
Postorder = list(map(int, input().split(' ')))
if len(Inorder) != n or len(Postorder) != n :
print('Input Error')
exit()
result = list(map(str, recursion(Inorder, Postorder)))
print(' '.join(result))
* 메모리 초과
-> 파이썬에서 리스트를 슬라이싱 할 경우에는 새로운 리스트를 만들게 된다. 재귀로 계속 슬라이싱을 하게되서 메모리 초과로 문제가 풀리지 않고, 이를 해결하기 위해선 리스트는 한개를 사용하고 인덱스를 넘겨서 참조하는 방식으로 코드를 수정해야할 것 같다..