pstree: How can I force a tree node to one side?
Putting a nil node is not tricky but rather good maths. Adding manually some space would be ugly.
In pstree you manipulate (ordered) n-ary trees so there is no notion of left or right child node. You can only give a list of child nodes (ordered).
Think of how you will implement binary trees (t := () | (t, t)) with ordered n-ary trees (t := list of trees). The two following binary trees are different.
* *
/ != \
* *
While they are equal as n-ary trees. You need to explicitly encode the skip of the left child node to simulate that in n-ary trees.
The pstree creators proposed you a distinguished \Tn
node (nil node) for that purpose.
\pstree{\TR{a}}{
\Tn
\TR{b}
}
Just like when a missing information is an information.
use \Tn
for a "null node" ...
\documentclass{article}
\usepackage{pst-tree}
\begin{document}
\pstree[levelsep=25pt]{\Tcircle{10}}{
\pstree{\Tcircle{1}}{
\Tn
\pstree{\Tcircle{5}}{\Tcircle{4}{\Tn}}
}
\pstree{\Tcircle{16}}{
\Tn
\pstree{\Tcircle{17}}{
\Tn
\Tcircle{21}
}
}
}
\end{document}
I resorted to inserting invisible nodes ({\psset{linestyle=none}\TR{}}
) into the tree, which pushes the other node towards one side. It worked for what I needed, but is a bit hackish and behaves like an invisble node, not as a well-defined offset to one side. (For example, in the rendered image, it would be a hassle to shift that 4 further right where it should be.)
\pstree[levelsep=25pt]{\Tcircle{10}}
{
\pstree{\Tcircle{1}}
{
{\psset{linestyle=none}\TR{}}
\pstree{\Tcircle{5}}
{
\Tcircle{4}
{\psset{linestyle=none}\TR{}}
}
}
\pstree{\Tcircle{16}}
{
{\psset{linestyle=none}\TR{}}
\pstree{\Tcircle{17}}
{
{\psset{linestyle=none}\TR{}}
\Tcircle{21}
}
}
}
Gives
10
/ 1 16
\ 5 17
/ 4 21