결과적으로, 의사 코드는 아래와 같이 작성할 수 있습니다.
<Solution>
노드 번호를 좌표 값에 따라 정렬한다.
- (1순위) y 좌표: 큰 값 -> 작은 값
- (2순위) x 좌표: 작은 값 -> 큰 값
정렬된 노드 번호 순으로 이진 트리를 생성한다.
생성된 이진 트리를 통해 각각 전위 순회 및 후위 순회를 수행한다.
import sys
sys.setrecursionlimit(10 ** 6)
class Node:
def __init__(
self,
node_num: int,
coords: list,
left = None,
right = None
):
self.node_num = node_num
self.coords = coords
self.left = left
self.right = right
def has_left(self):
return self.left
def has_right(self):
return self.right
def make_binary_tree(nodeinfo: list) -> Node:
# 노드 번호를 정렬 -> (y 좌표가 큰 순서 + x 좌표가 작은 순서)
node_nums = [idx+1 for idx in range(len(nodeinfo))]
node_nums = sorted(
node_nums,
key=lambda x: (-nodeinfo[x-1][1], nodeinfo[x-1][0])
)
# 이진 트리 구성
root = None
for node_num in node_nums:
if not root:
root = Node(node_num, nodeinfo[node_num-1])
else:
# 분기는 항상 루트 노드에서 시작합니다!
parent = root
cur_node = Node(node_num, nodeinfo[node_num-1])
while True:
if parent.coords[0] > cur_node.coords[0]: # x 좌표 비교
if parent.has_left():
parent = parent.left
continue
parent.left = cur_node
break
else:
if parent.has_right():
parent = parent.right
continue
parent.right = cur_node
break
return root
def pre_order(root: Node, routes: list):
if root is None: return
routes.append(root.node_num)
pre_order(root.left, routes)
pre_order(root.right, routes)
def post_order(root: Node, routes: list):
if root is None: return
post_order(root.left, routes)
post_order(root.right, routes)
routes.append(root.node_num)
def solution(nodeinfo):
answer = [[], []]
# 1. 트리 구성
root = make_binary_tree(nodeinfo)
# 2. 전위 순회 실시
pre_order(root, answer[0])
# 3. 후위 순회 실시
post_order(root, answer[1])
return answer