写在前面:
上一篇文章中我们聊到了队列——漫画趣解——队列
相信很多小伙伴都知道了如何实现队列;
那么这次,时光同样采用漫画形式,
给大家聊一聊什么是二叉树,如何实现二叉树的递归遍历;
思维导图:
什么是树?
树是一种非线性结构,有一个直接前驱,但可能有多个直接后继(1:n);
树的定义具有递归性,树中还有树;
树可以为空,即结节点个数为0;
如图:
若干术语:
根:根节点,没有前驱;
叶子:终端结点,没有后继;
双亲:上层的那个结点,就是直接前驱;
孩子:下层结点的子树,就是直接后继;
结点:树的数据元素;(上图的结点数为11)
结点的度:结点挂接的子树数,有几个直接后继就是几度;
树的度:所有结点度中的最大值,Max{各结点的度},(上图树的度为2);
树的深度(或高度):所有结点中最大的层数,(上图数的深度为3层);
什么是二叉树?
二叉树:
特征:每个结点最多只有两个子结点(不存在度大于2的结点);
5种形态:
常见的二叉树有两种重要形态,满二叉树和完全二叉树;
满二叉树:
叶子结点全部都在最底层;
除叶子结点外,每个结点都有左右两个子节点;
完全二叉树:
叶子结点全都都在最底的两层;
最后一层只缺少右边的叶子结点,左边一定有叶子结点;
除了最后一层,其它层的结点个数均达到最大值;
二叉树的遍历:
二叉树也是有顺序存储和链式存储,那么其中存储的数据如何读取出来呢?
于是就有了二叉树的遍历,总共有3种遍历方式:
先序遍历,中序遍历和后序遍历;
先序遍历:
也就是先访问根结点,再左边子结点,最后右边子结点;俗称DLR;
上图中先序遍历访问的结果就是:
A-B-C-D-E-F-G-H;
中序遍历:
也就是先访问左结点,再根结点,最后右结点;俗称LDR;
上图中中序遍历访问的结果是:
B-D-C-E-A-F-H-G;
后序遍历:
先访问左结点,再右结点,最后根结点;俗称LRD;
上图中后序遍历访问的结果是:
D-E-C-B-H-G-F-A;
代码实现:
文中完整源码获取请关注公众号《程序员的时光》;
后台回复——数据结构源码,可以获得常见数据结构代码;
二叉树递归遍历实现;
我们以这个二叉树为例:
结点实体类:
方法类:
主函数:
运行结果(这里以先序遍历为例):
读者可以自行试试中序遍历和后序遍历;
好了,今天就先分享到这里了,下期给大家带来二叉树的非递归遍历的讲解!
更多采用漫画趣解编程知识的文章,欢迎关注我的微信公众号,一起学习进步!