领你入门认识二叉树

784 阅读4分钟

什么是二叉树?

其实树的种类有很多,什么 BST / B- / B+ / AVL 一大堆,倘若要认真的学,足足够你学大半年。是不是有点懵了?懵就对了。

其实前端,掌握二叉树真的足矣,二叉树也是 数据结构 中 重中之重 的一种,掌握好它的一些基本特性,其实二叉树也就迎刃而解了。本文将带你彻底搞懂二叉树的一些基本知识点。不认识二叉树的小伙伴可以先看看下图。

那二叉树的基本特性又有哪些呢?无非是以下几点

  1. 四个遍历方式(前序,中序,后续,层序遍历)
  2. 二叉树的第i层上最多有 2^i-1 (i>=1) 个节点

                  

       其实像 BST / B- / B+ / AVL 一大堆,也就是在二叉树的基础上增加一些特性而已;比如说堆,其实也就是一个特殊的二叉树(满二叉树),就是在二叉树的基础上再满足一些特定的条件而已。

四个遍历方式

  1. 前序遍历(左右)
  2. 中序遍历(左右)
  3. 后序遍历(左右
  4. 层序遍历(也叫BFS)

细心的小伙伴肯定会发现,[ 前中后序这三个遍历,其实就是根的位置放在哪里而已,比如说前序遍历,就是访问节点的顺序按照 根->左->右。而层序遍历,就以根节点开始为第一层,向下遍历每一层而已 ]。层序遍历有点像水滴滴到水面,水波纹慢慢扩散开来的感觉。以上图为基础来感受一下。

                     

tips:到这里,你一定要记住我上面分析的核心 前中后序这三个遍历,.......]。如果记不住,我们再来读一遍。前中后序这三个遍历,其实就是根的位置放在哪里而已,比如说前序遍历,就是访问节点的顺序按照 根->左->右。而层序遍历,就以根节点开始为第一层,向下遍历每一层而已。

前序遍历

前序遍历我不想画图整晕你了,因为很多小伙伴可能不熟悉递归和栈这个数据结构,如果想熟悉这两个东西可以看下我之前写的文章,万法之王递归。

废话不多说,带你弄清楚前序遍历。根据我上面让你记住的核心,我们不难发现,前中后序三个遍历按照 [ 根 ]->左->右 这样的遍历方式,根的位置在前就叫前序,在中间就叫中序,在最后面就叫后续。三个遍历的方式我都以一种办法解决,我把它叫做拔萝卜法,一个萝卜一个坑,把萝卜拔完就行了。

具体怎么拔萝卜呢?我建议你拿起笔和纸,或者电脑上的画板,跟着我的步骤走一遍。就以上图的二叉树为例。


把根节点当成萝卜,左右子树看成一个大萝卜,以此递归把全部的萝卜拔完出来即可。

中序遍历

其实中序遍历也是一样的,你只要把根这个萝卜拔完就行了,接下来我还是带大家过一遍拔萝卜法,直接上步骤。


后序遍历

后序遍历也是一样的,我们再来过一遍拔萝卜法。


代码实现

代码实现有两种方式,递归版的就不多说了,因为实在太简单了。非递归版的可能有些小伙伴会说很难,其实真的不难,这里我再次推荐你看我的万法之王递归,只要你深刻理解了递归,和递归的状态树,其实你就可以很轻松的把递归用栈给模拟出来代码了。我把这种办法叫颜色标记法。访问过的节点标记为1,没有访问过的标记为0。

                

扩展再模拟一种


到这里树的前、中、后序遍历都可以用上图的模板套进去。很认真写的,点个赞吧QAQ。

层序遍历其实就是BFS广度优先算法,在这里就不赘述了,可以看我之前的文章实现一下。

总结

在日常的编码中,会数据结构和算法和不会的区别真的很大。

多加练习,你的代码风格会越来越风骚,编码能力也会越来越强的。

不要为了 算法 而学 算法。