树是什么?
- 一种分层数据的抽象模型
- 前端工作中常见的树包括:DOM树,级联选择、树形控件
- JS中没有树,但是可以用Object和Array构建树
- 树的常用操作:深度/广度优先遍历、先中后序遍历
什么是树的深度/广度优先遍历?
- 深度优先遍历:尽可能深的搜索树的分支
- 广度优先遍历:先访问离根节点最近的节点
深度优先遍历算法口诀
- 访问根节点
对根节点的children挨个进行深度优先遍历
广度优先遍历算法口诀
- 新建一个队列,把根节点入队
- 把对头出队并访问
- 把对头的children挨个入队
- 重复第二三步,知道队列为空
二叉树的先中后遍历
二叉树是什么?
- 树中每个节点最多只能有两个子节点
- 在JS中通常用Object来模拟二叉树
先序遍历算法口诀
- 访问根节点
- 对根节点的左子树进行先序遍历
- 对根节点的右子树进行先序遍历
中序遍历算法口诀
- 对根节点的左子树进行中序遍历
- 访问根节点
- 对根节点的右子树进行中序遍历
后续遍历算法口诀
- 对根节点的左子树进行后续遍历
- 对根节点的右子树进行后续遍历
- 访问根节点
二叉树的先中后序遍历(非递归版)
LeetCode #104 二叉树的最大深度
给定一个二叉树,找出其最大深度。
二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。
- 说明: 叶子节点是指没有子节点的节点。
- 示例:给定二叉树 [3,9,20,null,null,15,7]
返回它的最大深度 3 。
解题思路:
- 求最大深度,考虑使用深度优先遍历
- 在深度优先遍历过程中,记录每个节点所在层级,找出最大层级即可。
解题步骤:
- 新建一个变量记录最大深度
- 深度优先遍历整棵树,并记录每个节点的层级,同时不断刷新最大深度这个变量。
- 遍历结束返回最大深度的变量
复杂度:
- 时间复杂度:O(n)
- 空间复杂度:最坏 O(n)最好 O(logN) (隐形调用了函数堆栈)
LeetCode #111 二叉树的最小深度
给定一个二叉树,找出其最小深度。
最小深度是从根节点到最近叶子节点的最短路径上的节点数量。
说明:叶子节点是指没有子节点的节点。
- 输入:root = [3,9,20,null,null,15,7]
- 输出:2
- 输入:root = [2,null,3,null,4,null,5,null,6]
- 输出:5
提示:
- 树中节点数的范围在 [0, 105] 内
- -1000 <= Node.val <= 1000
解题思路:
- 求最小深度,考虑使用广度优先遍历
- 在广度优先遍历过程中,遇到叶子节点,停止遍历,返回节点层级
解题步骤:
- 广度优先遍历整颗树,并记录每个节点的层级
- 遇到叶子节点,返回节点层级,停止遍历
复杂度:
- 时间复杂度:O(n)
- 空间复杂度:O(n)
LeetCode #102 二叉树的层序遍历
给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。
示例:
二叉树:[3,9,20,null,null,15,7]
返回其层次遍历结果:
解题思路:
- 层序遍历顺序就是广度优先遍历
- 不过在遍历时候需要记录当前节点所处的层级,方便将其添加到不同的数组中
解题步骤:
- 广度优先遍历(用队列)
- 遍历过程中,记录每个节点的层级,并将其添加到不同的数组中
复杂度:
- 时间复杂度:O(n)广度优先遍历
- 空间复杂度:O(n)
优化方案:
LeetCode #94 二叉树的中序遍历
给定一个二叉树的根节点 root ,返回它的 中序 遍历。
示例:
- 输入:root = [1,null,2,3]
- 输出:[1,3,2]
- 输入:root = []
- 输出:[]
- 输入:root = [1]
- 输出:[1]
- 输入:root = [1,2]
- 输出:[2,1]
- 输入:root = [1,null,2]
- 输出:[1,2]
提示:
- 树中节点数目在范围 [0, 100] 内
- -100 <= Node.val <= 100
优化方案:
LeetCode #112 路径总和
给定一个二叉树和一个目标和,判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和。
说明: 叶子节点是指没有子节点的节点。
示例:
给定如下二叉树,以及目标和 sum = 22
返回 true, 因为存在目标和为 22 的根节点到叶子节点的路径 5->4->11->2。
解题思路:
- 在深度优先遍历的过程中,记录当前路径的节点值的和
- 在叶子节点处,判断当前路径的节点值的和是否等于目标值
解题步骤:
- 深度优先遍历二叉树,在叶子节点处,判断当前路径的节点值的和是否等于目标值,是九返回true
- 遍历结束,如果没有匹配到,就返回false
复杂度:
- 时间复杂度 O(n)
- 空间复杂度 O(n)
前端与树:遍历JSON的所有节点值
用途:清洗JSON
前端与树:渲染Antd的树组件
树-总结
- 树是一种分层数据的抽象模型,在前端广泛应用
- 树的常用操作:深度、广度优先遍历,先中后序遍历...
Comments | NOTHING