[路飞] leetcode 103. 二叉树的锯齿形层序遍历

126 阅读2分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

一、题目描述

leetcode 103. 二叉树的锯齿形层序遍历

给你二叉树的根节点 root ,返回其节点值的 锯齿形层序遍历 。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。

示例 1:

输入: root = [3,9,20,null,null,15,7]
输出: [[3],[20,9],[15,7]]

示例 2:

输入: root = [1]
输出: [[1]]

示例 3:

输入: root = []
输出: []

提示:

  • 树中节点数目在范围 [0, 2000] 内
  • -100 <= Node.val <= 100

二、思路分析

递归

无需展开理解,利用递归函数的语意信息去进行程序设计。
层序遍历,每层的节点存到一个数组中;
先让每层从左到右依次存入对应数组中,这里需要定义一个k来确定当前节点应该存入哪个数组中。
题目要求实现锯齿形层序遍历,锯齿形只需把偶数层对应的数组反转即可。

① 上面提到的是直接每层都是从左到右存入数组中,然后最后统一反转偶数层数组;
② 也可以直接在遍历每层数据时,如果是偶数层的那么让其元素从头部插入元素unshift();否则push()

三、JavaScript代码

/**
 * Definition for a binary tree node.
 * function TreeNode(val, left, right) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.left = (left===undefined ? null : left)
 *     this.right = (right===undefined ? null : right)
 * }
 */
/**
 * @param {TreeNode} root
 * @return {number[][]}
 */
// ①
function getResult(root, k, ans) {
    if(root == null) return root;
    if(k == ans.length) ans.push([]);
    ans[k].push(root.val);
    getResult(root.left, k+1, ans);
    getResult(root.right, k+1, ans);
}
function reverse(arr) {
    for(let i = 0, j = arr.length - 1; i < j; i ++, j --){
        // [arr[i], arr[j]] = [arr[j], arr[i]] // 用解构
        let mid = arr[i];
        arr[i] = arr[j];
        arr[j] = mid;
    }
    return arr
}
var zigzagLevelOrder = function(root) {
    let ans = [];
    getResult(root, 0, ans);
    for(let i = 1; i < ans.length; i +=2){
        reverse(ans[i]);
    }
    return ans
};

// ②
function getResult(root, k, ans) {
    if(root == null) return root;
    if(k == ans.length) ans.push([]);
    if(k%2) {
        ans[k].unshift(root.val)
    }else {
        ans[k].push(root.val)
    }
    getResult(root.left, k+1, ans);
    getResult(root.right, k+1, ans);
}
var zigzagLevelOrder = function(root) {
    let ans = [];
    getResult(root, 0, ans);
    return ans
};

四、总结