简单介绍

在计算机相关的文章中,树状图是最常见的几种图之一。树状图经常被用来用来演示结构、层次、算法等内容。而二叉树是最基础的树状图之一,掌握二叉树的画法就可以用图像展示一些算法或者数据结构了。

在 LaTeX 中,tikztikz-qtree两个包被用于绘制树状图,它们可以很方便的做出树状图来。。
tikz是 LaTeX 中一个用来绘制图的包,使用 Alexis Dimitriadis’ Qtree 语法。而tikz-qtree则是在tikz的基础上做出的一个专门绘制树状图的包,比如给 Qtree 增添了很多功能,以及在 pdfTEX 和 XƎTEX 上支持pst-qtree

TikZ

先来介绍一下如何在 TikZ 中绘制树状图。按照树、森林、二叉树的大致顺序介绍,因为二叉树比较简单,但是有足够展示各种使用方法。

如果你想查阅其他 TikZ 语法,可以查阅一个非官方的在线文档:[https://tikz.dev]。(https://tikz.dev)

代码结构

首先,LaTeX 文件的代码结构如下:

%自定义类型和格式
\documentclass[10pt]{article}%导入tikz包
\usepackage{tikz}\begin{document}\begin{tikzpicture}%在这里输入绘制树的代码
\end{tikzpicture}\end{document}

下面演示的所有的代码,除非特殊说明,不然都是放在上述结构中的%在这里输入绘制树的代码的位置。

绘制一颗简单的树

绘制树的语句由表示树开始的\node 、节点信息和表示一颗树结束的分号;组成。大括号里写的是节点名称和信息。

比如下面这个语句会生成一颗有四个叶节点的树:

\node
%这里的parent是要显示的文本内容
{parent}%这里的child表示是子节点,而后面的child 1才是要显示的文本内容child {node {child 1}}child {node {child 2}}child {node {child 3}}child {node {child 4}}
;

生成效果如下:

生成森林

上文说到,\node 表示树的开始,分号;表示树的结束。所以直接有几棵树写几段树的语句即可。只需要注意森林中每棵树的位置即可。

例如:

\node
{parent}child {node {child 1}}child {node {child 2}}child {node {child 3}}child {node {child 4}};\node at (0,2)
{z}child {node {a}}child {node {b}}child {node {3}}child {node {4}}
;

生成的森林如下:

绘制基础的二叉树

一棵基础的二叉树由一个父节点和两个字节点构成,生成代码如下:

\node
{parent}child {node {child 1}}child {node {child 2}}
;

效果如下:

自定义某部分的颜色

如果想自定义颜色,在父节点类型{parent}前面或子节点类型名称child后面加个[],然后将颜色写在其中。

比如说用红色标记父节点:

\node
[red]{parent}child {node {child 1}}child {node {child 2}}
;

效果如下:

再比如说用红色标记左子节点:

\node
{parent}child [red]{node {child 1}}child {node {child 2}}
;

效果如下:

线的样式

可以使用下面代码来调整树中线段的样式,比如实线、虚线等。

默认情况下,线段是实线,但是如果要把上面这个树的右节点的线段从实线换成虚线,那么可以使用下面的语句来实现:

\node
{parent}child [red] {node {child 1}}child {node {child 2} edge from parent [dashed]}
;

效果如下:

别看这里很简单,但是支持或可以实现的样式非常非常多,这里细说太冗余了,还请移步:https://tikz.dev/tikz-actions。

节点样式

绘制内容简单的树状图的时候,一般都会用在节点外围画一个圆,那么可以在父节点类型{parent}前面或子节点类型名称child后面加个[],在其中加上draw和要形状等属性信息(如果有的话),从而来为前文绘制的二叉树添加圆圈。如下:

\node
[draw, circle] {parent}child {node[draw, circle] {child 1}}child {node[draw, circle] {child 2}}
;

效果如下:

绘制复杂二叉树(嵌套使用)

二叉树不可能只有这种基础组成,所以还要来嵌套使用。而嵌套就是在某个子节点中(也就是大括号中{}),写它的子节点。看看下面的例子你就能懂了:

\node {parent}child {node {1}} child {node {2}child {node {3}}child {node {4}}}
;

生成的二叉树效果如下:

tikz-qtree

可以看到,使用tikz包画复杂的树很很麻烦,要打一堆nodechild等词,所以tikz-qtree进行了改进,使用简单的语法即可画出复杂的树。

代码结构

首先,LaTeX 文件的代码结构如下:

%自定义类型和格式
\documentclass[10pt]{article}%导入tikz包和tikz-qtree包(因为后者是基于前者,所以必须两个都导入)
\usepackage{tikz}
\usepackage{tikz-qtree}\begin{document}\begin{tikzpicture}%在这里输入绘制树的代码
\end{tikzpicture}\end{document}

下面演示的所有的代码,除非特殊说明,不然都是放在上述结构中的%在这里输入绘制树的代码的位置。

绘制一颗简单的树

tikz-qtree画一棵树非常简单。

树的开头使用\Tree表示开始。方括号[]用来划分出子树,句点.表示子树的根。语句如下(需要注意的是,子树的根节点后面就算没有节点了,但是也要加空格):

\Tree
[.1
[.2 ] [.3 ] [.4 ] [.5 ]
]

生成树如下:

生成森林

tikz-qtree生成森林的方式和tikz不一样,因为一个tikzpicture作用域中只能有一颗树。所以要写在多个tikzpicture中。如果想水平摆放,可以直接连着写:

%自定义类型和格式
\documentclass[10pt]{article}%导入tikz包和tikz-qtree包(因为后者是基于前者,所以必须两个都导入)
\usepackage{tikz}
\usepackage{tikz-qtree}\begin{document}\begin{tikzpicture}\Tree
[.1
[.2 ] [.3 ] [.4 ] [.5 ]
]
\end{tikzpicture}\begin{tikzpicture}\Tree
[.1
[.2 ] [.3 ] [.4 ] [.5 ]
]
\end{tikzpicture}\end{document}

生成效果如下:

如果想指定树叶的方向和排列位置,可以在tikzpicture后面加上[grow=][grow'=]来指定,参数为updownleftright来表示开口向上下左右方向。
并且这两种参数不太一样,

  1. [grow=]是逆时针排列子节点;
  2. [grow'=]是顺时针排序子节点。

不仅是为了方便理解,还因为这个使用有点特殊。如果想两棵树并排,那需要在两个节点之间使用百分号%。下面来举几个例子来详细说明一下。

下面语句会生成上下排列、子节点逆时针排列的两个二叉树:

\begin{tikzpicture}[grow'=up]
\Tree
[.1
[.2 ] [.3 ]
]
\end{tikzpicture}\begin{tikzpicture}[grow'=down]
\Tree
[.1
[.2 ] [.3 ]
]
\end{tikzpicture}

生成图如下:

但是给语句中间加上百分号%,那就会得到并列的树:

\begin{tikzpicture}[grow'=up]
\Tree
[.1
[.2 ] [.3 ]
]
\end{tikzpicture}
%
\begin{tikzpicture}[grow'=down]
\Tree
[.1
[.2 ] [.3 ]
]
\end{tikzpicture}

绘制基础的二叉树

上文已经看到了,绘制二叉树只用很简单的结构即可。.开头的表示跟节点,下面每个叶节点用方括号[]包裹起来:

\begin{tikzpicture}
\Tree
[.1
[.2 ] [.3 ]
]
\end{tikzpicture}

线的样式

没有那么丰富的自定义功能,但是可以支持调整线的粗细、样式等属性。

如果想加粗所有的线和节点,就使用以下语句:

\tikzset{edge from parent/.append style={very thick}}

例如:

\begin{tikzpicture}
\tikzset{edge from parent/.append style={very thick}}\Tree
[.1
[.2 ] [.3 ]
]
\end{tikzpicture}

虚线的话将[dashed]加在\begin{tikzpicture}后面,如下:

\begin{tikzpicture}[dashed]
\Tree
[.1
[.2 ] [.3 ]
]
\end{tikzpicture}

如果想带箭头,那么将[semithick,->]加在\begin{tikzpicture}后面,如下:

\begin{tikzpicture}[semithick,->]
\Tree
[.1
[.2 ] [.3 ]
]
\end{tikzpicture}

节点样式

如何加粗节点上一节提到了,使用\tikzset{edge from parent/.append style={very thick}},那么如何给节点加圆圈呢?

只能一个个节点加圆圈,使用以下结构和语句:

\begin{tikzpicture}
\Tree
[.1
[.2 ] [.\node[draw, circle]{3}; ]
]
\end{tikzpicture}

绘制复杂二叉树(嵌套使用)

tikz-qtree来绘制复杂的二叉树就很容易了,就是需要注意大括号闭合。
中括号[]包含每个节点和其子节点。.表示根节点,后面跟的是其子节点。

\begin{tikzpicture}
\Tree
[.1
[.2 [.3 ] ]
[.4 [5 6 ] ]
]
\end{tikzpicture}

希望能帮到有需要的人~

如何在 LaTeX 中画一个树状图(使用tikz和tikz-qtree包中的宏绘制树、森林、二叉树)相关推荐

  1. echarts树状图点击展开子节点_CPU眼里的结构设备树节点及属性详解

    1 设备树(device tree)简介DTSpec定义一个devicetree的约束来描述硬件设备,boot引导程序将设备树传递给用户程序的内存空间中,并传递给用户相应设备树的指针.设备树为一个树形 ...

  2. Plotly.js使用详细介绍(折线图、饼状图、点图、水平条形图、桑基图、树状图、等值线图)

    目录 0 写在前面 1 HTML代码 2 折线图 2.1 基本折线图 2.2 复杂折线图 2.2.1 轨迹 2.2.2 布局 3 饼状图 3.1 基本饼状图 3.2 饼图子图 3.3 甜甜圈图 4 点 ...

  3. html树状图右侧_树状图及制作方法(Excel 2016/Excel 2013)

    ↑↑↑关注ExcelEasy,让Excel更简单 树状图是一种展示层次结构数据的图表,可以很好的揭示各类别数据的比例关系及类别内数据的组成结构.今天为大家详细介绍一下树状图的制作方法 树状图在Exce ...

  4. python中plotly绘制树地图_聚类分析python画树状图--Plotly(dendrogram)用法解析 - 人人都是架构师...

    1.前言 聚类分析是机器学习和数据分析中非常常见的分类方法, 当我们用到层次聚类(系统聚类)时,最常用的分析方法就是绘制树状图, 比较常见的统计软件像SPSS.SAS.R等都可以直接绘制树状图,比较简 ...

  5. MatLab中画树状图方法treeplot(nodes)中描述树结构的矢量nodes的构造

    按要求需要用matlab画树状图,在网络上找到两句代码: nodes = [0 1 2 2 4 4 4 1 8 8 10 10]; treeplot(nodes); 画出了如下图: 其中矢量nodes ...

  6. visio画等分树状图

    一 树状图形状 Search里搜索Tree,找到Double Tree或者Multi Tree的形状 二 分出更多branch 按住主干上的黄色小方块,拖出更多分支. 三 等分分支 将每个分支和对应的 ...

  7. python树状图可视化_如何可视化(树状图)一个层次项目字典?

    这是我第一次用Python从字典格式的分层数据中进行可视化.数据的最后一部分如下所示:d = {^2820: [^391, ^1024], ^2821: [^759, 'w', ^118, ^51], ...

  8. 画出计算机系统构成的树状图,如何绘制树状层次结构的树状思维导图?

    树状图,(又为树形图)因其外观像倒过来的树的样子,所以命名树状图.树形图是数据树的图形表示形式,以父子层次结构来组织对象.是枚举法的一种表达方式.初中学生学习概率时通常会要画的树状图.学会分析一件事物 ...

  9. R语言ggplot2可视化:为层次聚类树状图dendrogram中的簇进行着色、在树状图dendrogram中为不同的层次聚类簇配置不同的色彩

    R语言ggplot2可视化:为层次聚类树状图dendrogram中的簇进行着色.在树状图dendrogram中为不同的层次聚类簇配置不同的色彩 #层次聚类树状图dendrogram labs = pa ...

最新文章

  1. linux+软盘启动程序,软盘上的Linux系统方案
  2. 文件操作的常用命令 -- grep, cut, sed
  3. 【注意】关于Redis存在远程命令执行漏洞的安全公告
  4. android 异常打印
  5. 鲜为人知的DC-DC外围电感选型方法
  6. 蓝牙基础知识进阶——Physical channel
  7. python 内存溢出能捕获吗_Python内存泄漏和内存溢出的解决方案
  8. 祝威廉 :Rust FFI 实践
  9. RAC3——RAC原理开始
  10. 开局一张图,理解Vuex
  11. 为基因序列片段在NCBI的GenBank数据库申请登录号
  12. 基于广度优先搜索的六度空间理论的验证
  13. python多变量相关性分析_多变量相关性分析(一个因变量与多个自变量)
  14. c语言10k ntc 测温表,10KNTC热敏电阻对照表.doc
  15. Echars柱状图嵌套 居中对齐 柱子占比宽度由大到小嵌套包含 并用小箭头标记当前产出位置
  16. 多波次导弹发射中的规划问题(二)
  17. DC综合基础知识学习
  18. 操作系统:文件的物理结构(文件分配方式)
  19. 为什么选择Chrome浏览器
  20. html如何实现立体效果,CSS3实现3D立体效果

热门文章

  1. 不可思议的每日培训(1)——日复一日的每日分享
  2. 怎么压缩gif图大小?gif格式怎么压缩大小?
  3. 【JDK下载与安装教程】
  4. windows 7 开机错误 未能连接到一个Windows服务
  5. 为什么打开edge浏览器,就出来qq导航,hao123页面等等!
  6. BZOJ1103 大都市 DFS序 树状数组维护差分数组
  7. Android 节日短信送祝福(功能篇:1-数据库操作类与自定义ContentProvider)
  8. python get pip.py_get-pip.py 安装
  9. 编码中关于二义性的解释
  10. 安卓蓝牙操作+蓝牙工具类