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

139 阅读1分钟

题目描述

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

eg: 给定二叉树 [3,9,20,null,null,15,7]

    3
   / \
  9  20
    /  \
   15   7
[
  [3],
  [20,9],
  [15,7]
]

思路分析

这道题的思路和之前二叉树递归遍历思路一致,我们来再次利用递归分析的方法分析一下:

1、 函数意义:将二叉树的同层数据都放在一个数组中输出

2、 边界条件: 二叉树为空

3、递归过程: 二叉树进行遍历输出,同层的放在一个数组(因此我们要先实现一个二叉树的输出)

实现完毕之后,需要按照锯齿形输出,因此找到2的倍数位置的节点,将对应数组反转,输出为最终结果。

代码实现

/**
 * 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)
 * }
 */
const __zigzagLevelOrder = (root, res, index) => {
    if (!root) return;
    res[index] ? res[index].push(root.val) : (res[index] = [root.val]);
    __zigzagLevelOrder(root.left, res, index + 1);
    __zigzagLevelOrder(root.right, res, index + 1);
};
/**
 * @param {TreeNode} root
 * @return {number[][]}
 */
var zigzagLevelOrder = function (root) {
    let res = [];
    __zigzagLevelOrder(root, res, 0);
    for (let i = 1; i < res.length; i += 2) {
        res[i] = res[i].reverse();
    }

    return res;
};