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

166 阅读1分钟

创建BinarySearchTree类

我们先来创建Node类来表示二叉搜索树中的每个节点,代码如下

export class Node {
    constructor(key){
        this.key = key; // 节点值
        this.left = null; // 左侧子节点引用
        this.right = null; // 右侧子节点引用
    }
}

题目描述

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

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

    3
   / \
  9  20
    /  \
   15   7

返回锯齿形层序遍历如下:

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

解题思路

独立思考很重要这个题目和102. 二叉树的层序遍历做法完全一样。
1.先将root节点全部压入栈中queue
2.申明一个result数组,作为返回结果,申明一个level作为记录层级
3.循环queue,申明一个临时temp数组,作为当前层的数据临时存放,最后push到result中
4.根据题目不同,在处理temp到result的过程有点不同,需要锯齿一样层序遍历,所以在偶数层的时候,需要把数据反过来存放

代码

思考1

/**
 * 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) {
    if(!root) return [];
    let queue = [root];
    let result = [];
    let level = 1;
    while(queue.length){
        let temp = [];
        let size = queue.length;
        for(let i = 0; i < size; i++){
            let n = queue.shift();
            // 在偶数层的时候,需要用unshift(),把数据添加到最前面
            // 在奇数层时,需要用push(),把数据添加到队尾
            if(!(level % 2)){
                temp.unshift(n.val);
            } else {
                temp.push(n.val);
            }
            n.left && queue.push(n.left);
            n.right && queue.push(n.right);
        }
        result.push(temp);
        level++
    }
    return result;
};

思考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)
 * }
 */
/**
 * @param {TreeNode} root
 * @return {number[][]}
 */
var zigzagLevelOrder = function(root) {
    if(!root) return [];
    let queue = [root];
    let result = [];
    while(queue.length){
        let temp = [];
        let size = queue.length;
        for(let i = 0; i < size; i++){
            let n = queue.shift();
            temp.push(n.val);
            n.left && queue.push(n.left);
            n.right && queue.push(n.right);
        }
        result.push(temp);
    }
    // 对返回的result进行循环处理,偶数层的数据,采用数组的reverse()方法
    result.map((item, index) => {
        if(index % 2){
            item = item.reverse()
        }
    })
    return result;
};