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

153 阅读1分钟

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

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

题目分析

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

思路讲解

只需要将从上到下打印二叉树 II的结果里面索引为奇数的数组中的元素反转即可。 索引是奇数数组中每个元素反转,偶数不变

示例

image.png

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

示例2:
输入: root = [1]
输出: [[1]]

示例3:
输入: root = []
输出: []

代码

/*
 * @lc app=leetcode.cn id=103 lang=javascript
 *
 * [103] 二叉树的锯齿形层序遍历
 */

// @lc code=start
/**
 * 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[][]}
 */
var zigzagLevelOrder = function(root) {
  let ans = []
  getResult(root, 0, ans)
  // 索引判断
  for (let k = 1; k < ans.length; k+=2) {
    for (let i = 0, j = ans[k].length - 1; i < j; i++, j--) {
      [ans[k][i], ans[k][j]] = [ans[k][j], ans[k][i]]
    }
  }
  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)
}
// @lc code=end