[路飞] 44——leetcode -剑指 Offer 32 - II. 从上到下打印二叉树 II

135 阅读2分钟

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)
}