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

leetcode-103.png

102.二叉树的层序遍历一样,只不过是正一次,反一次

下面这种解法不是很高效,每次都要reverse一下

var zigzagLevelOrder = function (root) {
    if (!root) {
        return []
    }
    let flag = true
    let res = []
    let queue = []
    queue.push(root)
    while (queue.length) {
        let size = queue.length
        let level = []
        for (let i = 0; i < size; ++i) {
            let node = queue.shift()
            level.push(node.val)
            if (node.left) {
                queue.push(node.left)
            }
            if (node.right) {
                queue.push(node.right)
            }
        }
        let tmp = flag ? level : level.reverse()
        flag = !flag
        res.push(level)
    }
    return res
};

直接计算每次要插入地方的下表即可
level[index] = node.val

BFS

var zigzagLevelOrder = function (root) {
    if (!root) {
        return []
    }
    let flag = true
    let res = []
    let queue = []
    queue.push(root)
    while (queue.length) {
        let size = queue.length
        let level = []
        for (let i = 0; i < size; ++i) {
            let node = queue.shift()
            let index = flag ? i : size - i - 1
            level[index] = node.val
            if (node.left) {
                queue.push(node.left)
            }
            if (node.right) {
                queue.push(node.right)
            }
        }
        flag = !flag
        res.push(level)
    }
    return res
};

DFS

var zigzagLevelOrder = function (root) {
    if (!root) {
        return []
    }
    let res = []
    var dfs = function (root, level) {
        if (!root) return
        if (res.length === level) {
            res.push([])
        }
        if (level % 2 === 0) {
            res[level].push(root.val)
        } else {
            res[level].unshift(root.val)
        }
        dfs(root.left, level + 1)
        dfs(root.right, level + 1)
    }
    dfs(root, 0)
    return res
};
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容