LeetCode每日一题——二叉树的层序遍历

203 阅读1分钟

LeetCode 第102题 二叉树的层序遍历栈

题目:

给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。

示例:

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

    3
   / \
  9  20
    /  \
   15   7

返回其层次遍历结果:

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

思路1:

从题目名字"层序遍历"就能很容易联想到二叉树的广度优先遍历。题目要求二叉树的值按层级返回,那么我们遍历的时候以深度作为节点就行了。 每次遍历一层,将这一层的儿子节点储存到下一次遍历的数组中。直到数组为空。 代码如下:

var levelOrder = function(root) {
    if(!root) return [];
    let arr = [],list = [root];
    while(list.length>0){
        let currentArr=[],childArr=[];
        for(let node of list){
            if(!node) continue;
            currentArr.push(node.val);
            childArr.push(node.left);
            childArr.push(node.right);
        }
        if(currentArr.length>0) arr.push(currentArr);
        list = childArr;
    }
    return arr;
};

思路2:

这道题也可以通过深度优先遍历的方式解答。每次将深度level带入,存值的时候根据level不同,存在不通的数组内。 代码如下:

var levelOrder = function(root) {
    let arr=[],level=0;
    function levelSearch(root,level){
        if(root==null) return;
        if(arr[level]){
            arr[level].push(root.val);
        }else{
            arr[level] = [root.val];
        }
        levelSearch(root.left,level+1);
        levelSearch(root.right,level+1);
    }    
    levelSearch(root,level);
    return arr;
};

这里我是用递归实现的,也可以将每次要遍历的节点压入栈,通过栈的方式来实现。这里就不做演示了。