Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
一、题目描述
给你二叉树的根节点 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
};