壹引
想必凡是接触过二叉树算法的同学,在刚上手那会,一定都经历过题目无从下手,甚至连题解都看不懂的痛苦。由于leetcode不方便调试,题目做错了也不知道错在哪里,最后无奈的cv答案后心里还不断安慰自己。不甘心想着要不直接背模板吧,可当天一知半解的记住了,不到半个月回头面对一道曾做过的简单二叉树题,脑袋里跟看一道新题一样。
那么二叉树对于我这个不是计算机专业的人来说难在哪呢?第一,我始终无法在脑中构建递归的过程,就像我的思维空间不足以支撑递归在我的脑中运行,大致脑补了两步就直接乱套了,我想象不出这个过程。
第二,对于二叉树的前中后层序遍历始终是一知半解,因为不理解递归到底怎么运行的,所以心里其实不知道它们三者到底差异在哪,为啥arr.push(root.val)写的地方不同,就实现了三种不同遍历方式?小小的脑袋里留下了大大的疑惑。
consttraverse=(root)={if(root===null){turn;};//前序遍历traverse(root.left);//中序遍历traverse(root.right);//后序遍历}
那么本文就是为了解答这些疑问而来,我将从递归说起,用图解JS调用栈的方式阐述递归思路,帮助大家在脑中构建这个过程,之后再解释二叉树前中后序遍历为什么逻辑处理的位置不同,就能达到不同差异,那么本文开始。
贰从递归说起
我先来聊聊如何理解递归,倘若问你什么是递归?我想大部分人脑袋里马上冒出函数自己调用自己就是递归,确实没错。概念虽然简单,可是随手写一个简单的递归又得思索很久,那么我们先来总结递归的几个需要注意的点:
函数得自己调用自己你只用