프로그래밍 면접 문제 21: Tree Reverse Level Order Print
프로그래밍 면접 문제 21: Tree Reverse Level Order Print
이 글은 블로그 http://www.ardendertat.com/의 프로그래밍 면접에 대한 글을 번역한 글입니다.
이전글 – 프로그래밍 면접 문제 20: Tree Level Order Print
이 문제는 이전에 포스팅한 level order print와 매우 유사합니다. 트리를 계층 순서대로 다시 출력하지만, 이번에는 아래부터 시작해서 루트(root) 계층으로 출력합니다. 전에 사용했던 것과 동일한 트리를 사용하면:
출력 값은 다음과 같습니다:
4 5 6
2 3
1
이 문제의 해결 방법은 level order print와 유사합니다. 트리의 루트(root)부터 넓이 우선 탐색(BFS)을 시작해 각 노드를 큐에 넣습니다. 아래에서 시작해서 위 방향으로 출력을 해야하고 넓이 우선 탬색(BFS)은 위에서 아래로 처리하기 때문에 이 시점에서는 노드를 출력하지 않습니다. 넓이 우선 탐색을 완료한 다음 별도의 루프(loop)에서 출력합니다. 또한 새 라인을 제 위치에 출력하기 위해서 각 계층의 노드 수를 기록해 스택(stack)에 저장합니다. 따라서 넓이 우선 탐색을 완료 후에 다음과 같은 두 가지 자료 구조를 갖게 됩니다.
노드 값이 저장된 큐: [1, 2, 3, 4, 5, 6]. 큐는 넓이 우선 탐색에 의해 위에서 아래로 그리고 왼쪽에서 오른쪽 방향으로 탐색이 완료된 후 생성되었습니다.
각 계층의 노드의 수가 저장된 스택: [3, 2, 1]. 이 자료구조는 스택이기 때문에 첫 번째 요소는 가장 깊은 계층의 노드 수를 나타내며, 마지막 요소는 항상 트리의 루트(root)에 해당하는 1을 나타냅니다.
이 두 개의 자료구조를 생성한 후 첫 번째 줄에 출력하려는 노드는 큐의 마지막 부분에 있습니다. 그리고 출력할 노드의 수는 스택 맨 위에 있습니다. 따라서 루프의 각 반복 작업에서 스택의 요소를 빼낸 다음 노드의 수를 확인하고 큐의 끝에서부터 이 수만큼 출력합니다. 위의 예제 트리를 사요하면, 첫 번째 줄의 출력에는 스택의 첫 번째 요소인 3개의 노드가 포함됩니다. 그리고 출력할 노드는 큐 끝의 3개의 노드 [4, 5, 6] 입니다. 두 번째 줄의 출력에는 스택의 두 번째 값인 2개의 노드가 포함됩니다. 이 노드들은 큐에서 첫 번째 줄 바로 전에 있는 2개의 노드로서 [2, 3] 입니다. 최종적으로, 마지막 줄의 노드는 스택의 마지막 요소인 1입니다. 그리고 출력할 노드는 큐의 시작 부분에 있으며 이는 1입니다.
코드는 다음과 같습니다:
def reverseLevelOrderPrint(tree): if not tree: return nodes = [tree] #queue levelCount = collections.deque([1]) #stack currentCount, nextCount = 1, 0 i=0 while i < len(nodes): currentNode = nodes[i] currentCount -= 1 if currentNode.left: nodes.append(currentNode.left) nextCount += 1 if currentNode.right: nodes.append(currentNode.right) nextCount += 1 if currentCount == 0: #finished this level if nextCount == 0: #no more nodes at next level break #continue with next level levelCount.appendleft(nextCount) currentCount, nextCount = nextCount, currentCount i += 1 printIndex = len(nodes) for count in levelCount: output = nodes[printIndex-count:printIndex] print ' '.join(map(str, output)), '\n', printIndex -= count
이 문제는 가장 기본적인 자료 구조인 트리, 스택, 큐를 사용하는 훌륭한 문제입니다.