今天搞定层序遍历相关问题 | 刷题打卡

214 阅读2分钟

102.二叉树的层序遍历:

102.jpg

var levelOrder = function(root) {
    var result = []; // 用于存放最终结果
    var recursion = function (node, level, result){ // 递归函数
        if(!node) return null; // 如果节点为空,结束当前递归
        if(level === result.length) result.push(new Array()); // 如果层level和result数组的长度相同,需要往数组里添加一个空数组,用于存放当前层的节点值
        result[level].push(node.val); // 往当前层数组里添加节点值
        recursion(node.left, level + 1, result); // 递归遍历左右子树,值得注意的是子树的level应该是当前level+1(下一层)
        recursion(node.right, level + 1, result);
    }
    recursion(root, 0, result); // 执行第一次递归
    return result; // 返回结果
};

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

103.jpg

var zigzagLevelOrder = function(root) {  // 代码和上一题基本一样
    var result = [];
    var recursion = function (node, level, result){
        if(!node) return null;
        if(level === result.length) result.push(new Array());
        if(level % 2 === 0) result[level].push(node.val);  // 偶数层尾部添加
        if(level % 2 === 1) result[level].unshift(node.val); // 奇数层头部添加,即可实现一个奇数层翻转的效果
        recursion(node.left, level + 1, result);
        recursion(node.right, level + 1, result);
    }
    recursion(root, 0, result);
    return result;
};

107.二叉树的层序遍历 II

107.jpg

var levelOrderBottom = function(root) {
    var result = [];
    var recursion = function (node, level, result){
        if(!node) return null;
        if(level === result.length) result.push(new Array());
        result[level].push(node.val);
        recursion(node.left, level + 1, result);
        recursion(node.right, level + 1, result);
    }
    recursion(root, 0, result);
    for(var i = 0, j = result.length - 1; i < j; i++, j--){ // 在结果数组中将数组翻转
        [result[i], result[j]] = [result[j], result[i]];
    }
    return result;
};

429.N 叉树的层序遍历

439.jpg

var levelOrder = function(root) {
    var result = [];
    var recursion = function (node, level, result){
        if(!node) return null;
        if(level === result.length) result.push(new Array());
        result[level].push(node.val);
        for(var child of node.children){ // N叉树遍历子树(对应二叉树就是遍历左右子树)
            recursion(child, level + 1, result);
        }
    }
    recursion(root, 0, result);
    return result;
};

本人师从开课吧胡光胡船长,短短一个月,从算法小白到leetcode200题,真的爽。 此次刷题打卡用的都是递归的方法,递归写代码就是舒服,简洁,一个字爽!今天的打卡刷题就到这里啦,欢迎点赞评论~