2022年了?这些树相关的算法你还不会么(JS)

1,108 阅读2分钟

一、树简介

树,是一种分层数据的抽象模型。

在前端中,数的应用也有很多,比如DOM树,级联选择空间,目录树形控件等等。

在JavaScript中,没有树这种数据结构,但是我们可以用Object和Array来模拟树。比如,在vue中的router,就是树结构

image.png

二、深度优先遍历

口诀:

1.访问根节点

2.对根节点的children挨个进行深度优先遍历 image.png

我们把上图转换为一个树结构,进行深度优先遍历,代码如下

carbon.png

image.png

三、广度优先遍历

口诀: 1.新建一个队列,把根节点入队

2.把队头节点出队并访问

3.把队头的childern挨个入队

4.重复2、3步骤,直至队列为空

image.png

carbon (1).png

image.png

四、二叉树的先序遍历

口诀:

1.访问根节点

2.对根节点的左子树进行先序遍历

3.对根节点的右子树进行先序遍历

代码如下:

carbon (2).png

结果如下:

image.png

五、二叉树的中序遍历

口诀:

  1. 对根节点的左子树进行中序遍历

  2. 访问根节点

  3. 对根节点的右子树进行中序遍历

代码如下:

carbon (3).png

image.png

六、二叉树的后序遍历

口诀:

1.对根节点的左子树进行后序遍历

2.对根节点的右子树进行后序遍历

3.访问根节点

代码如下:

carbon (4).png

结果:

image.png

七、非递归版先中后序遍历

无论怎么变化,二叉树的这三种遍历其实都是在对口诀进行翻译,口诀即是我们解题的思路。

7.1 先序遍历

非递归版最需要注意的地方就是生命的stack一开始是包含root的,这是很多人容易忽略的一点》

carbon (5).png

7.2 后序遍历

后续遍历的写法我们可以利用先序遍历和栈的后进先出特性来完成

carbon (7).png

7.3 中序遍历

中序遍历你难理解的地方在于如何处理右子树,我们用指针直接指向右子树即可完成

carbon (6).png

八、leetcode-112-路径总和

image.png

由题意便知,这道题应该用深度优先遍历,因为是由上而下的路径。我们确定了方向就可以顺着去往下写,首先我们先写出深度优先遍历,代码如下:

carbon.png

深度遍历之后,我们回想改如何判断路径的和呢,其实我们给dfs加一个参数就好,在进行深度遍历的时候每一次都加上。

carbon (1).png

接下来我们要想得就是和给定的要求数据做对比,返回结果。我们声明结果res=fasle,当相等时,我们赋值为true即可。需要注意的是在什么情况下需要这样操作,在没有左右子节点时,再进行比对

carbon (2).png

最后我们在考虑一下边界情况,当root为空时,直接返回false

carbon (3).png