什么是二叉树?
其实树的种类有很多,什么 BST / B- / B+ / AVL 一大堆,倘若要认真的学,足足够你学大半年。是不是有点懵了?懵就对了。
其实前端,掌握二叉树真的足矣,二叉树也是 数据结构 中 重中之重 的一种,掌握好它的一些基本特性,其实二叉树也就迎刃而解了。本文将带你彻底搞懂二叉树的一些基本知识点。不认识二叉树的小伙伴可以先看看下图。
那二叉树的基本特性又有哪些呢?无非是以下几点
- 四个遍历方式(前序,中序,后续,层序遍历)
- 二叉树的第i层上最多有 2^i-1 (i>=1) 个节点
其实像 BST / B- / B+ / AVL 一大堆,也就是在二叉树的基础上增加一些特性而已;比如说堆,其实也就是一个特殊的二叉树(满二叉树),就是在二叉树的基础上再满足一些特定的条件而已。
四个遍历方式
- 前序遍历(根左右)
- 中序遍历(左根右)
- 后序遍历(左右根)
- 层序遍历(也叫BFS)
细心的小伙伴肯定会发现,[ 前中后序这三个遍历,其实就是根的位置放在哪里而已,比如说前序遍历,就是访问节点的顺序按照 根->左->右。而层序遍历,就以根节点开始为第一层,向下遍历每一层而已 ]。层序遍历有点像水滴滴到水面,水波纹慢慢扩散开来的感觉。以上图为基础来感受一下。
tips:到这里,你一定要记住我上面分析的核心 [ 前中后序这三个遍历,.......]。如果记不住,我们再来读一遍。前中后序这三个遍历,其实就是根的位置放在哪里而已,比如说前序遍历,就是访问节点的顺序按照 根->左->右。而层序遍历,就以根节点开始为第一层,向下遍历每一层而已。
前序遍历
前序遍历我不想画图整晕你了,因为很多小伙伴可能不熟悉递归和栈这个数据结构,如果想熟悉这两个东西可以看下我之前写的文章,万法之王递归。
废话不多说,带你弄清楚前序遍历。根据我上面让你记住的核心,我们不难发现,前中后序三个遍历按照 [ 根 ]->左->右 这样的遍历方式,根的位置在前就叫前序,在中间就叫中序,在最后面就叫后续。三个遍历的方式我都以一种办法解决,我把它叫做拔萝卜法,一个萝卜一个坑,把萝卜拔完就行了。
具体怎么拔萝卜呢?我建议你拿起笔和纸,或者电脑上的画板,跟着我的步骤走一遍。就以上图的二叉树为例。
把根节点当成萝卜,左右子树看成一个大萝卜,以此递归把全部的萝卜拔完出来即可。
中序遍历
其实中序遍历也是一样的,你只要把根这个萝卜拔完就行了,接下来我还是带大家过一遍拔萝卜法,直接上步骤。
后序遍历
后序遍历也是一样的,我们再来过一遍拔萝卜法。
代码实现
代码实现有两种方式,递归版的就不多说了,因为实在太简单了。非递归版的可能有些小伙伴会说很难,其实真的不难,这里我再次推荐你看我的万法之王递归,只要你深刻理解了递归,和递归的状态树,其实你就可以很轻松的把递归用栈给模拟出来代码了。我把这种办法叫颜色标记法。访问过的节点标记为1,没有访问过的标记为0。
扩展再模拟一种
到这里树的前、中、后序遍历都可以用上图的模板套进去。很认真写的,点个赞吧QAQ。
层序遍历其实就是BFS广度优先算法,在这里就不赘述了,可以看我之前的文章实现一下。
总结
在日常的编码中,会数据结构和算法和不会的区别真的很大。
多加练习,你的代码风格会越来越风骚,编码能力也会越来越强的。
不要为了 算法 而学 算法。