Zeichnen Sie Array-Baum mit Tikz

Zeichnen Sie Array-Baum mit Tikz

Ich versuche, verschiedene Arten von rekursiven Aufrufen zu zeichnen, bei denen Arrays sortiert/manipuliert usw. werden. Ich muss also Bäume zeichnen, bei denen die Knoten eine Folge von Elementen enthalten können.

Momentan zeichne ich sie einfach in Powerpoint und es sollte ungefähr so ​​aussehen (ich habe das MERGE-Verfahren als Beispiel genommen):

MERGE-Prozedur

Ich habe hier einen Beitrag gesehen, der das gesamte Mergesort-Verfahren in Tikz zeigt, aber das ist nicht unbedingt das, was ich brauche. Ich muss in der Lage sein, Gruppenzellen auf jeder Ebene zu zeichnen und Pfeile zwischen Gruppen zwischen Ebenen zu zeichnen. Derzeit verwende ich Tikz für alle Bäume.

Antwort1

Hier ist eine Lösung mit forest:

Bildbeschreibung hier eingeben

Die Grundidee besteht darin, dass das Diagramm ein Baum ist, der nach Norden wächst ( grow'=north) und Pfeile hat, die nach hinten zeigen ( latex-). Jeder Knoten (mit Ausnahme der Blätter oben) ist ein mehrteiliger Knoten, der \tikzsetmit definiert wird 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}

verwandte Informationen