Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
剑指 Offer 32 - II. 从上到下打印二叉树 II
题目分析
从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行。
思路讲解
前序遍历整个二叉树,然后用一个二维数组来记录每层,存储每层的节点的值。
深度优先搜索:图的深度优先搜索遍历 (DFS) 类似于二叉树的先序遍历。
它的基本思想是:
- 首先访问出发点 x, 并将其标记为已访问过;
- 然后选取与 x 邻接的未被访问的任意一个顶点 v, 并访问它;
- 再选取与 v 邻接的未被访问的任一顶点并访问, 以此重复进行。 当一个顶点所有的邻接顶点都被访问过时, 则依次退回到最近被访问过的顶点, 若该顶点还有其他邻接顶点未被访问, 则从这些未被访问的顶点中取一个并重复上述访问过程, 直至图中所有顶点都被访问过为止。
一般使用递归来实现。
示例
给定二叉树: [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
返回其层次遍历结果:
[
[3],
[9,20],
[15,7]
]
代码
/**
* Definition for a binary tree node.
* function TreeNode(val) {
* this.val = val;
* this.left = this.right = null;
* }
*/
/**
* @param {TreeNode} root
* @return {number[][]}
*/
// 思路:锯齿形遍历和层序遍历都是我们这道题的一个变形
// dfs:深度优先搜索,先递归下去,在回溯上来;
var levelOrder = function(root) {
let ans = [] // 遍历每层节点的值
// 封装函数
getResult(root, 0, ans) // 0:代表变量k,遍历到第几层
return ans
};
var getResult = function(root, k, ans) {
if (!root) return null
if (k === ans.length) ans.push(new Array()) // 说明还没开始遍历这一层
ans[k].push(root.val)
getResult(root.left, k + 1, ans)
getResult(root.right, k + 1, ans)
}