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

260 阅读1分钟

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

题目

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

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

    3
   / \
  9  20
    /  \
   15   7

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

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

解题思路

这也能算一题,习惯就好

参见另一片:从上到下打印二叉树 II

递归法

通过level变量记录二叉树递归层级;将枚举到的二叉树节点值塞进指定层级中。
层级为基数从左向右塞数据,
层数为偶数,从右向左塞数据。

代码

将本层全部节点打印到一行,并将下一层全部节点加入队列;
层级为基数从左向右塞数据,
层数为偶数,从右向左塞数据。

var zigzagLevelOrder = function(root) {
    let result = []
    helper(root,0)
    return result
    function helper(node,level){
        if(node === null) return 0;
        if(result[level] === undefined){
            result[level] = []
        }
        const n =  node.val
        if(level %2 === 0){
            result[level].push(n) 
        }else{
            result[level].unshift(n)
        }
        helper(node.left,level+1)
        helper(node.right,level+1)
    }
};

迭代法

var zigzagLevelOrder = function(root) {
   if (root === null) return []
    const result = [];
    let sign = 0;
    let stack = [root]
    while (stack.length) {
        const path = []
        for (let i = stack.length - 1; i >= 0; i--) {
        let temp = stack.shift()
        if(sign%2 === 0){
            path.push(temp.val)
        }else{
            path.unshift(temp.val)
        }
        
        temp.left && stack.push(temp.left)
        temp.right && stack.push(temp.right)
        }
        result.push(path);
        sign++
    }
    return result
};