Winner Tree(승자 트리)는 n개의 external node와 n-1개의 internal node로 이루어진 complete binary tree이다.
Winner tree는 토너먼트의 대진표라고 생각하면 되는데, external node는 토너먼트의 모든 참가자, internal node는 경기 후 다음 라운드에 진출한 참가자를 의미한다.
위 그림과 같은 승자 트리가 있다고 하자. 이 트리에서 맨 아래에 있는 리프 노드들이 external node, 나머지 노드들이 internal node가 된다. 이 승자 트리는 값이 더 작은 값이 승자가 되어 위로 올라간다. 이렇게 하면 최종 승자가 이 트리의 최솟값이 되는데, 이러한 승자 트리를 Min Winner Tree라고 한다. 반대로 더 큰 값이 승자가 되어 최댓값이 최종 승자가 되는 승자 트리는 Max Winner Tree라고 한다.
트리의 높이(깊이)는 external node를 제외하면 가 된다.
승자 트리는 최댓값 혹은 최솟값을 구할 수 있다는 특징 덕분에 어떠한 배열을 정렬하는데에 사용할 수 있다. 다음은 min winner tree를 이용하여 오름차순으로 정렬하는 예시이다.
먼저, 모든 external node의 최솟값인 1을 배열에 넣는다. 그리고 가장 아래의 internal node에서 1 대신 8을 승자로 올린 후 승자를 다시 계산한다. 이렇게 하면 오른쪽 external node에 있던 1이 최종 승자가 된다.
최종 승자가 된 1을 배열에 넣고, 1 대신 4를 승자로 올리고 승자를 다시 계산한다. 이 경우 2가 최종 승자가 된다.
최종 승자가 된 2를 배열에 넣고, 2 대신 5를 승자로 올리고 승자를 다시 계산한다. 이 경우 3이 최종 승자가 된다.
최종 승자가 된 3을 배열에 넣고, 3 대신 6을 승자로 올리고 승자를 다시 계산한다. 이 경우 4가 최종 승자가 된다.
최종 승자가 된 4를 배열에 넣고, 4 대신 5를 승자로 올리고 승자를 다시 계산한다. 이 경우 5가 최종 승자가 된다.
최종 승자가 된 5를 배열에 넣고, 5 대신 6을 승자로 올리고 승자를 다시 계산한다. 이 경우 6이 최종 승자가 된다.
최종 승자가 된 6을 배열에 넣고, 6 대신 8을 승자로 올리고 승자를 다시 계산한다. 이 경우 8이 최종 승자가 된다. 마지막으로 8을 배열에 넣으면, external node들을 오름차순으로 정렬할 수 있다. 내림차순으로 정렬하고자 할 때에는 max winner tree를 사용하면 된다.
Loser Tree(패자 트리)는 winner tree와 같은 구조를 가지지만, 각 비교의 승자 대신 패자를 저장하는 트리이다.
위 그림과 같은 Min Loser Tree가 있다고 하자. 이 트리에서도 min winner tree와 똑같이 최솟값을 찾을 것이다. 따라서 두 리프 노드 중 더 작은 값을 승자로 올린다. 이때 첫 번째, 두 번째 internal node는 각각 3, 1이 되는데, 둘 중 더 작은 값인 1이 부모 노드로 올라가고, 원래 3, 1이 있던 자리는 각각의 패자인 6, 8이 저장된다.
오른쪽 서브 트리도 동일하게 진행된다. 세 번째, 네 번째 internal node는 각각 2, 1이 되고, 이 중 더 작은 값인 1이 부모 노드로 올라간다. 그리고 원래 2, 1이 있던 자리는 각각의 패자인 5, 4가 저장된다.
가장 위의 노드들 중 가장 작은 값은 1이므로, 왼쪽의 1이 승자로 올라가고, 기존에 1이 있던 자리는 패자였던 3이 저장된다.
패자 트리는 이렇게 승자를 정하고, 패자를 원래 자리에 저장한다.
Winner tree, loser tree는 주로 메모리 크기가 부족해서 이진 탐색이 불가능할 때, 즉 다량의 데이터를 처리할 때 사용된다. 그 중 데이터가 지속적으로 갱신되는 상황에서는 winner tree보다 loser tree가 더 효과적이다.
loser tree가 잘못 작성된것 같아요 2가 없네요