본문 바로가기

알고리즘/Baekjoon

트리. [2263]

[1. 문제 설명]

n개의 정점을 갖는 이진 트리의 정점에 1부터 n까지의 번호가 중복 없이 매겨져 있다.

이와 같은 이진 트리의 중위 순회후위 순회가 주어졌을 때,

전위 순회를 구한다.

 

 

[2. 풀이 접근]

각 순회를 보면 트리의 대략적인 구조를 알 수 있다.

 

중위 순회: [.... Left sub tree...] Root [.... Right sub tree....]

 

후위 순회: [.... Left sub tree...] [.... Right sub tree....] Root

 

후위 순회의 마지막 원소는 전체 tree 의 root 임을 알 수 있다.

이렇게 알아낸 root 를 통해 중위 순회에서 해당 root 의 left sub tree 와 right sub tree 를 알 수 있다.

 

이제, Left sub tree 와 Right sub tree 역시 위와 같은 방식으로 접근 할 수 있다.

 

중위 순회의 Left sub tree 와

후위 순회의 Right sub tree 를 전체 문제 중 하나의 부분문제로 바라볼 수 있기 때문이다.

 

===== 성능 개선 =====

위 접근으로도 제한 시간내 풀이가 가능하지만,

시간을 더 단축 할 수 있다.

 

먼저, 위 접근에서 시간이 걸리는 부분은 중위 순회에서 root 위치를 찾는 것 이다.

탐색 시간은 O(N) 이 걸리는데, 이 시간을 O(1) 으로 줄일 수 있다.

 

table[value] = index 가 되도록 중위 순회에 관한 테이블을 만들어 내면 된다.

 

그러나, table 에 적힌 index 는 절대 위치를 반환하기 때문에,

각 sub tree 들의 부분 문제에서 해당 index 를 바로 사용 할 수 없다.

 

ex) 전체 tree 에서 중위 순회의 right sub tree 가 index: 8 부터 시작한다고 했을 때

이 sub tree 의 부분 문제에서는 index 가 0으로 바뀐다.

 

따라서, index 사용 시 상대적인 값으로 변경해주어야 하고,

이에 필요 한 추가 데이터를 함수로 전달해주어야 한다.

 

 

[3. 코드 - 성능 개선 전]

 

 

[3. 코드 - 성능 개선 후]

 

 

'알고리즘 > Baekjoon' 카테고리의 다른 글

트리. [4803]  (0) 2022.10.03
트리. [5639]  (0) 2022.10.02
트리. [1991]  (0) 2022.10.02
트리. [1967]  (0) 2022.09.30
트리. [1167]  (0) 2022.09.29