2014년 7월 10일 목요일

1991 트리순회

이진 트리를 전위 순회(preorder traversal), 중위 순회(inorder traversal), 후위 순회(postorder traversal) 한 결과를 출력하는 문제이다.
이 문제를 풀기위해선 트리구조를 구현해야 하는데,
처음엔 귀차니즘으로 인해 단순히 배열로 인덱스를 2배씩 늘려가는 형식의 트리구조를 만들었다. 정답은 맞았지만, 이것은 틀린 소스이다.
그 이유는 26개의 노드를 전부 한쪽으로 쏠리게 입력하면, 내가 처음 짠 소스로 돌렸을 경우, 인덱스가 최대 2^26-1 까지 가게 되어 메모리제한이 걸리게 된다.
빨리 깨달았어야 했는데 다른 분의 소스를 보고나서야 깨닫고 말았다.. 완전히 내 불찰이다.
바뀐 트리구조는, 노드 마다 인덱스가 아닌 이름으로 정의 되어 있어서 A-Z까지 26개의 배열을 선언하기만 하면 된다. 단, int 형 배열이 아닌 left와 right 변수를 가진 struct 구조이다.
트리구조를 완성 시켰으면 세가지 순회를 해야하는데, 이 알고리즘은 간단하다.

재귀를 이용하여
//전위 순회일때 여기서 출력
f(node->left);
//중위 순회일때 여기서 출력
f(node->right);
//후위 순회일때 여기서 출력

위와 같은 위치로 출력을 해주면 된다.
반성에 반성을 거듭하는 문제였다..

소스

댓글 없음:

댓글 쓰기