zl程序教程

您现在的位置是:首页 >  后端

当前栏目

【LaTex】3.2 数据结构(TikZ)

数据结构 3.2 LaTeX
2023-09-11 14:20:29 时间


  除Graphviz外,TikZ也是可以进行数据结构绘图的。以同样的红黑树为例子,用TikZ重新实现一遍。Graphviz的基本模型就是节点和边,这和图算法的两个最基本概念是一样的。而Tikz也是这样,但是tikz在数据结构绘图方法有两种方法:path和tree。

Path绘图

基本语法

  节点,命令语法为:

\node[name=\name] at (\x,\y) {\content};

  当然,节点除了name这个属性外,还有填充颜色,字体颜色,形状等样式属性。
  ,命令语法为:

\draw[->] (\from) -> (\to);

  循环语句,语法为:

\foreach \var1/\var2/\var3/... in {data1/data2/data3,...}{
	code...;
}

代码例子

  以红黑树为例子,Tikz代码要比graphviz代码简洁很多:

\documentclass[UTF8, a4paper,12pt]{article}
\usepackage{tikz}
\begin{document}
	\begin{tikzpicture}
		\foreach \x/\y/\name in {0/4/0,3/4/4,4/8/5,5/4/6,7/4/8}{
			\node[white,fill=black,shape=circle,name=\name] at (\x,\y) {\name};
		}
		\foreach \x/\y/\name in {2/6/3,6/6/7,1/2/2,8/2/9}{
			\node[white,fill=red,shape=circle,name=\name] at (\x,\y) {\name};
		}
		\foreach \from/\to in {5/3,5/7,3/0,3/4,0/2,5/7,7/6,7/8,8/9} {
			 \draw[->] (\from) -- (\to);
		}
	\end{tikzpicture}
\end{document}

编译效果

在这里插入图片描述
  Tikz视觉效果是完全不属于graphviz的。

Tree绘图

  Tree绘图重要的关键字是child。而且child支持嵌套,所以就可以使用child轻松地画出红黑树,不需要手动计算每个节点的坐标了。child的基本语法是下面这个样子:

\documentclass[tikz,11pt]{article}
\usepackage{tikz}

\begin{document}
	\begin{tikzpicture}
		\node {A}
			child {node {B}}
			child {node {C}}
			child {node {D}};
	\end{tikzpicture}
\end{document}

  编译效果如下:
在这里插入图片描述

基本语法

  sibling distance是一个重要的配置,单位可以是cm,也可以是pt等长度单位。
  anchor,控制子节点的方向,取值为west和east,但是要注意,是反向的,也就是说east是向左的,而west才是向右的。
  edge from parent,控制边的样式,比如可以修改边的颜色,控制线条的样式,还可以给边加上文字,如下面的例子:

\documentclass[tikz,11pt]{article}
\usepackage{tikz}
\usepackage{ctex}
\begin{document}
	\begin{tikzpicture}
		\node {7}
		child {node {2}}
		child {node {9}edge from parent [blue,dashed] node {删除}};
	\end{tikzpicture}
\end{document}

  编译效果如下:
在这里插入图片描述

代码例子

  这里我用tree语法把上面的红黑树实现一下,代码如下:

\documentclass[tikz,11pt]{article}
\usepackage{tikz}

\begin{document}
	\begin{tikzpicture}[
		level 1/.style={sibling distance = 2.5cm},
		level 2/.style={sibling distance = 1.5cm}
	]
		\node  [white,fill=black,shape=circle] {5}
		child {
			node [white,fill=red,shape=circle] {3}
			child {
				node [white,fill=black,shape=circle] {0}
				child [anchor = west] { node [white,fill=red,shape=circle] {2}}
			}
			child {node [white,fill=black,shape=circle] {4}}
		}
		child {
			node [white,fill=red,shape=circle] {7}
			child {node [white,fill=black,shape=circle] {6}}
			child {
				node [white,fill=black,shape=circle] {8}
				child [anchor = west] { node [white,fill=red,shape=circle] {9}}
			}
		};
	\end{tikzpicture}
\end{document}

编译效果

在这里插入图片描述