一、树简介
树,是一种分层数据的抽象模型。
在前端中,数的应用也有很多,比如DOM树,级联选择空间,目录树形控件等等。
在JavaScript中,没有树这种数据结构,但是我们可以用Object和Array来模拟树。比如,在vue中的router,就是树结构
二、深度优先遍历
口诀:
1.访问根节点
2.对根节点的children挨个进行深度优先遍历
我们把上图转换为一个树结构,进行深度优先遍历,代码如下
三、广度优先遍历
口诀: 1.新建一个队列,把根节点入队
2.把队头节点出队并访问
3.把队头的childern挨个入队
4.重复2、3步骤,直至队列为空
四、二叉树的先序遍历
口诀:
1.访问根节点
2.对根节点的左子树进行先序遍历
3.对根节点的右子树进行先序遍历
代码如下:
结果如下:
五、二叉树的中序遍历
口诀:
-
对根节点的左子树进行中序遍历
-
访问根节点
-
对根节点的右子树进行中序遍历
代码如下:
六、二叉树的后序遍历
口诀:
1.对根节点的左子树进行后序遍历
2.对根节点的右子树进行后序遍历
3.访问根节点
代码如下:
结果:
七、非递归版先中后序遍历
无论怎么变化,二叉树的这三种遍历其实都是在对口诀进行翻译,口诀即是我们解题的思路。
7.1 先序遍历
非递归版最需要注意的地方就是生命的stack一开始是包含root的,这是很多人容易忽略的一点》
7.2 后序遍历
后续遍历的写法我们可以利用先序遍历和栈的后进先出特性来完成
7.3 中序遍历
中序遍历你难理解的地方在于如何处理右子树,我们用指针直接指向右子树即可完成
八、leetcode-112-路径总和
由题意便知,这道题应该用深度优先遍历,因为是由上而下的路径。我们确定了方向就可以顺着去往下写,首先我们先写出深度优先遍历,代码如下:
深度遍历之后,我们回想改如何判断路径的和呢,其实我们给dfs加一个参数就好,在进行深度遍历的时候每一次都加上。
接下来我们要想得就是和给定的要求数据做对比,返回结果。我们声明结果res=fasle,当相等时,我们赋值为true即可。需要注意的是在什么情况下需要这样操作,在没有左右子节点时,再进行比对
最后我们在考虑一下边界情况,当root为空时,直接返回false