tikz로 배열 트리 그리기

tikz로 배열 트리 그리기

배열이 정렬/조작되는 등 다양한 종류의 재귀 호출을 그리려고 합니다. 따라서 노드에 일련의 요소가 포함될 수 있는 트리를 그려야 합니다.

현재 저는 파워포인트로 그림을 그리고 있는데 대략 다음과 같을 것입니다. (MERGE 절차를 예로 들었습니다):

병합 절차

여기에서 tikz의 전체 병합 정렬 절차를 보여주는 게시물을 보았지만 이것이 반드시 필요한 것은 아닙니다. 각 레벨에 그룹 셀을 그리고 레벨 사이의 그룹 사이에 화살표를 그릴 수 있어야 합니다. 현재 저는 모든 나무에 tikz를 사용하고 있습니다.

답변1

다음을 사용하는 솔루션은 다음과 같습니다 forest.

여기에 이미지 설명을 입력하세요

기본 아이디어는 다이어그램이 북쪽으로 자라는 나무( grow'=north)이고 화살표가 뒤쪽을 가리키는 것( latex-)이라는 것입니다. 각 노드(상단의 나뭇잎 제외)는 \tikzsetwith 를 사용하여 정의된 다중 부분 노드입니다 rectangle split.

\documentclass{article}

\usepackage{forest}
\usetikzlibrary {shapes.multipart}

\tikzset{multinode/.style={rectangle split, rectangle split horizontal, rectangle split parts=#1, anchor=center}}

\colorlet{c1}{yellow!30}
\colorlet{c2}{green!30}
\colorlet{c3}{red!30}
\colorlet{c4}{cyan!30}

\begin{document}

\begin{forest}
    for tree={grow'=north, l sep=7mm, edge={gray!70,very thick, latex-, shorten <=2pt, shorten >=2pt}, draw, anchor=center}
    [\nodepart{one}1\nodepart{two}1\nodepart{three}2\nodepart{four}2\nodepart{five}5\nodepart{six}7\nodepart{seven}7\nodepart{eight}8, multinode=8, {rectangle split part fill={c2,c4,c1,c3,c3,c1,c4,c2}}, for children={multinode=4}
        [\nodepart{one}1\nodepart{two}2\nodepart{three}7\nodepart{four}8, {rectangle split part fill={c2,c1,c1,c2}}, for children={multinode=2}
            [\nodepart{one}2\nodepart{two}7, fill=c1, for descendants={fill=c1}[7][2]]
            [\nodepart{one}1\nodepart{two}8, fill=c2, for descendants={fill=c2}[8][1]]
        ]
        [\nodepart{one}1\nodepart{two}2\nodepart{three}5\nodepart{four}7, {rectangle split part fill={c4,c3,c3,c4}}, for children={multinode=2}
            [\nodepart{one}2\nodepart{two}5, fill=c3, for descendants={fill=c3}[2][5]]
            [\nodepart{one}1\nodepart{two}7, fill=c4, for descendants={fill=c4}[7][1]]
        ]
    ]   
\end{forest}

\end{document}

관련 정보