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

97 阅读1分钟

层序遍历的稍微升级

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

给个🌰 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],输出

var output = [
    [1],
    [3, 2],
    [4, 5, 6, 7],
    [10 ,9, 8]
]

上一篇 二叉树的层序遍历,照着动画演示

迭代

  • 用一个遍历index记录下是第几层, 单数层从左到右 双数层从右往左
  • 来做下调整即可
function levelorder(root) {
    // 空节点的情况不能忘记了😭
    if(root === null) return []
    // 输出结果
    const res = []
    // 先入栈第一层
    let stack = [root]
    // index 代表二叉树是第index层
    let index = 1
    
    // 循环终止条件:栈中没有节点
    while(stack.length) {
        // 循环依次输出我们的节点
        // 这里我们输出按照LeetCode的结果, 每一层一个数组
        const level = []
        // 需要下一层的栈保存我们下一层的节点
        const nextLevelNodes = []
        for (let i = 0; i < stack.length; i++) {
            if (index % 2 === 1) {
                level.push(stack[i].val)
            } else {
                level.push(stack[i].length - 1 - i)
            }
            
            if(stack[i].left) nextLevelNodes.push(stack[i].left)
            if(stack[i].right) nextLevelNodes.push(stack[i].right)
        }
        // 输出到我们的结果中
        res.push(level)
        // 当前层输出结束,我们把下一层变成当前层
        stack = nextLevelNodes
        // 层数加1
        index++
    }
    
    return res
}

递归

同理

var levelOrder = function(root) {
    // 空节点
    if (root === null) return []
    // 定义输出结果
    let res = []
    // 递归遍历,传根节点,层数:开始是第1层,输出结果存起来
    dfs(root, 1, res)
    return res
};

function dfs(root, index, res) {
    // 第一次深度遍历时候,先加上一个空数组
    if (res.length < index) {
        res.push([])
    }
    // 然后把第index层 结果的第index - 1项push 或 unshift
    if (index % 2 === 1) {
        res[index - 1].push(root.val)
    } else {
        res[index - 1].unshift(root.val)
    }
    
    // 对子节点递归遍历 层数加1
    if (root.left) dfs(root.left, index + 1, res)
    if (root.right) dfs(root.right, index + 1, res)
}

总结

波风水门