[路飞]_前端算法第六十四弹-二叉树的锯齿形层序遍历

97 阅读1分钟

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

例如:

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

    3
   / \\
  9  20
    /  \\
   15   7

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

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

这道题与二叉树的层序遍历只有一点不同,就是锯齿形,左右,右左的遍历,那我们只需要增加一下增肌的判断即可,当单数层数时左右遍历,当双数层数时右左遍历,反向遍历只需要将最新的值添加到队列最前面即可。

深度优先

var zigzagLevelOrder = function (root) {
    let res = [];
    let k = 0;
    getDetail(root, k, res)
    return res
    function getDetail(root, k, res) {
        if (!root) return [];
        if (k == res.length) res.push([])
        if (k % 2 == 0) {
            res[k].push(root.val);
        } else {
            res[k].unshift(root.val);
        }
        getDetail(root.left, k + 1, res)
        getDetail(root.right, k + 1, res)
    }
};

广度优先

var zigzagLevelOrder = function (root) {
    let res = [];
    if (!root) return res;
    let k = 0;
    let queue = [];
    queue.push(root)
    while (queue.length) {
        let temp = [];
        let len = queue.length
        for (let i = 0; i < len; i++) {
            let node = queue.shift();
            k % 2 == 0 ? temp.push(node.val) : temp.unshift(node.val)
            node.left && queue.push(node.left)
            node.right && queue.push(node.right)
        }
        k++
        res.push(temp)
    }
    return res
};