I'm using tikz
in study material and I want to show analogy between RB trees and B-trees (2,3,4 tree). I want my output looks something like this example from Wikipedia.
For RB tree I'm using almost exactly same settings as is showed in http://www.texample.net/tikz/examples/red-black-tree/ (just different settings for nil node). I could create 3 nodes in same layer, but it would use manually set position. I also do not know, hot to put these nodes together in rectangle.
Would anybody give me hints or solution? I will be very grateful.
Edit:
I've tried this:
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{arrows}
\begin{document}
\tikzset{
treenode/.style = {align=center, inner sep=4pt, text centered,font=\sffamily},
bnode/.style = {treenode, circle, white, font=\sffamily\bfseries, draw=black, fill=black, text width=1.5em},
rnode/.style = {treenode, circle, red, draw=red, text width=1.5em, very thick},
nilnode/.style = {treenode, minimum width=1.3em, minimum height=0.9em}
}
\begin{tikzpicture}[->,>=stealth',level/.style={sibling distance = 6cm/#1, level distance = 1.5cm}]
\node [bnode] {13}
child[level distance = 0cm]{ node [rnode] {8}
child{ node [bnode] {1}
child[level distance = 0cm]{ node [nilnode] {Nil} }
child[level distance = 0cm]{ node [rnode] {6}
child{ node [nilnode] {Nil} }
child{ node [nilnode] {Nil} }
}
}
child{ node [bnode] {11}
child[level distance = 0cm]{ node [nilnode] {Nil}}
child[level distance = 0cm]{ node [nilnode] {Nil}}
}
}
child[level distance = 0cm]{ node [rnode] {17}
child{ node [bnode] {15}
child[level distance = 0cm]{ node [nilnode] {Nil}}
child[level distance = 0cm]{ node [nilnode] {Nil}}
}
child{ node [bnode] {25}
child[level distance = 0cm]{ node [rnode] {22}
child{ node [nilnode] {Nil} }
child{ node [nilnode] {Nil} }
}
child[level distance = 0cm]{ node [nilnode] {Nil}}
}
}
;
\end{tikzpicture}
\end{document}
Output is this:
I need at least the rectangle as border of merged node. If you also know, how to insert some separator (under the arrows in same layer), it would be even better.
//I hope, that now the post meet the rules about question and sorry for previous version.
Best Answer
Since each "node" of the tree has almost everything constant, except the labels, this is a perfect place for an application of
pic
(requires version 3.0.0 of PGF/TikZ); for further details, please see Section 18 Pics: Small Pictures on Paths of the pgf manual.The code (some explanatory remarks below):
The result:
Explanation
Using the
pic
syntax in the following wayallows you to use
\pic
(or\path pic ...
) to draw each of the "nodes" in the formthe last argument ("box1" in the example) is simply a name for the fitting node using in the
pic
so you can then place other elements using this name; this name is also used to give a name to each of the three circular nodes forming each picture. Inside each\pic
, every circular node is internally named<name>-left
,<name>-middle
, and<name>-right
, where<name>
is the fourth argument.Foe example, using
will produce
Here, the fitting node (the gray filled rectangle) is assigned the name
box1
; the circular node labeled "12" isbox1-left
, the circular node labeled "5" isbox1-middle
, and the circular node labeled "8" isbox1-rught
.