✅ 이진 탐색 트리의 전위순회(V-L-R)를 후위순회(L-R-V)로 바꾸기
arr: 50 30 24 5 28 45 98 52 60
현재 노드: 50
서브트리 마지막 인덱스: arr.size()-1
30
서브트리 구분 인덱스 - 1
#include <iostream>
#include <vector>
using namespace std;
vector<int> arr;
void sol(int nodeIdx, int sub) { // 현재노드, 서브트리 범위
int cur=nodeIdx;
int subIdx=nodeIdx++; // 왼오 서브트리 구분점이 되는 인덱스 -> 현재 노드 다음 인덱스부터 탐색 시작
// 현재 노드 다음노드부터 서브트리가 될 수 있기 때문에 서브트리 구분 인덱스를 현재 노드 값보다 작을때까지 갱신
while (++subIdx<arr.size() && arr[subIdx]<arr[cur]);
// 이때, subIdx는 서브트리의 왼오를 구분할 수 있는 인덱스
// 왼쪽 서브트리 이어서 트리 탐색
// 현재 노드 다음 인덱스가 서브트리 구분 인덱스보다 작으면 아직 탐색할 왼쪽 서브트리가 남아있다는 뜻
// 현재 노드 다음 노드를 루트 노드로 해서 탐색,
// 이어서 탐색할 왼쪽 서브트리는 서브트리 구분 인덱스-1 -> 여기까지 왼쪽 서브트리 범위이기 때문
if (nodeIdx<=subIdx-1) sol(nodeIdx, subIdx-1);
// 현재 노드의 우측 서브트리 탐색
// 서브트리 구분 인덱스보다 서브트리 크기가 크다면 아직 탐색할 오른쪽 서브트리가 남은 것
if (subIdx<=sub) sol(subIdx, sub);
cout << arr[cur] << '\n';
}
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int n;
// 개수 제한없이 입력 받기
while (cin >> n) arr.push_back(n);
sol(0, arr.size()-1); // 노드는 제외하고 서브트리 탐색할 것이기 때문에 arr size - 1 이 서브트리 탐색 끝 범위가 됨
}