
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):
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
:
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 \tikzset
mit 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}