本期脑图:
一 前言:
上一期数据结构与算法小结2 撸了单向链表代码,是作为本篇的基础,其中一个核心思路都很重要:递归,可以说掌握了递归,基本上手动实现这些数据结构就已经成功了一半;
本期开始手撸代码模拟二叉树的遍历;
二 基本常识铺垫:
2.1 什么是树?
树是n(n大于等于0)个有限元素的集合:
1.n=0 时为空树
2.n>0 时:有且仅有一个称为根(root)的元素及m个(m>0)不相交的有限集合组成,每一个有限集合也可以看做是子树。
3.节点:在树中,一个元素也称作一个节点
2.1.1 为什么树结构很重要?
在查询操作上,以及在维持相对顺序上,树结构比链表有优势,而且树结构是生活中非常常见的结构,很多生活中的事务都可以用树结构来表示,你能想到有哪些生活的例子符合上面三个特点呢?
案例1 家族族谱:
案例2 产品功能分区:
案例3 和大家学习息息相关的目录
一图胜百字!以上包括第一张脑图结构都可以说是树结构;
关于树的应用(查找+维持相对顺序),我之前举例子写过mysql索引的结构,就涉及到了树结构;看完本篇,可以挑战阅读一下:
学习笔记--mysql索引底层数据结构_StefanSSSS的博客-CSDN博客
2.2 什么是二叉树?
顾名思义,一个节点有且最多有左右两个节点的树结构;
2.2.1 请指出下图中哪些是二叉树呢?且找出他们的根节点,叶子节点;
Here 's the answer !!!No picture ,Say 个J8;
以上这些都是二叉树,只不过有的是完全二叉树,有的是满二叉树,有的是非完全二叉树;
哪里是 根节点,叶子节点以及子树呢?
如图。(一张图抵得上度娘100字官方解释);
2.2.2 什么是满二叉树?
首先:一个二叉树节点如果有两个左右子节点,左边的为左孩子节点,右边的为右孩子节点:(如图)
满二叉树则是每一个非叶子节点都有左右孩子,且所有的叶子节点都在相同一个层级上;
那么上面这个图明显不是满二叉树,节点6没有右子节点,那么你可以补充一下使之变成满二叉树吗?走一个
2.2.3 什么是完全二叉树?
来自度娘:一棵深度为k的有n个结点的二叉树,对树中的结点按从上至下、从左到右的顺序进行编号,如果编号为i(1≤i≤n)的结点与满二叉树中编号为i的结点在二叉树中的位置相同,则这棵二叉树称为完全二叉树。
反正我是没看懂!
还是举例子吧:
首先,先来一个满二叉树,想要满足完全二叉树的要求,就必须按照
同一层级从右往左,不同层级从下往上按顺序舍掉,不能跳序;满足这个就算完全二叉树;
比如上图右树是满二叉树,左树是右树在第三层按从右到左的顺序拆掉一个,So 左树是一个完全二叉树。