LaTeX2010. 3. 5. 20:17
Heap은 특별한 형태의 tree 구조이다.

많은 예제를 찾아볼 수 있는 texample.net에서는 tikz를 이용하여 tree 구조를 그리는 법도 소개하고 있다.
http://www.texample.net/tikz/examples/merge-sort-recursion-tree/

거의 비슷한 예제로 다음과 같은 것도 있다.
http://forcecore.tistory.com/1019

Heap을 그릴 때마다 이렇게 일일이 입력하는 것은 귀찮으므로 프로그램을 만들었다. 이 프로그램을 LaTeX이나 TeX 명령으로 구현하는 것은 본인의 능력을 벗어나고, perl 등의 스크립트 언어에도 별로 익숙하지 않기 때문에 그냥 C로 만들었다. 컴파일하는 것이 귀찮긴 하지만 할 수 없다.

#include <stdio.h>G
#include <string.h>
#define MAX_NODE 100
#define MAX_NAME 5

char buffer[MAX_NODE][MAX_NAME];

void print_child(char buffer[][MAX_NAME], int number, int pos)
{
    if (pos >= number)
        return;
    printf("node ");
    printf("(%d) {%s}\n", pos+1, buffer[pos]);
    if (pos*2 + 1 < number) {
        printf("child {");
        print_child(buffer, number, pos*2 + 1);
        printf("}\n");
        if (pos*2 + 2 < number) {
            printf("child {");
            print_child(buffer, number, pos*2 + 2);
            printf("}\n");
        } else {
            printf("child [missing]");
        }
    }
}

int main(int argc, char* argv[])
{
    int i;
    for (i=0; i<MAX_NODE; ++i) {
        char *c = fgets(buffer[i], MAX_NAME, stdin);
        if (!c)
            break;
        int len = strlen(buffer[i]);
        if (buffer[i][len-1] == '\n')
            buffer[i][len-1] = '\0';
    }
   
    if (i < 1)
        return 1;

    printf("\\begin{tikzpicture}[\n"
            "level distance=12mm,\n"
            "level/.style={sibling distance=32mm/#1},\n"
            "level 3/.style={sibling distance=32mm/4},\n"
            "every node/.style={circle,draw,"
            "font=\\fontsize{9}{9}\\selectfont,minimum size=21pt}]\n"
            "\\");
    print_child(buffer, i, 0);
    printf(";\n\\end{tikzpicture}");

    return 0;
}

입력은 heap을 array로 구현했을 때의 순서대로 한 줄에 하나씩 넣어주면 되고, 조금씩 수정해서 쓰면 된다.

다음은 노가다의 산물. 위에서 만든 c 코드는 기본적인 것만 되고, 노드를 지우거나 오른쪽에 더 쓰는 건 노가다로 한 것이다.

Posted by asdfzxcv