[路飞]102. 二叉树的层序遍历

133 阅读1分钟

层序遍历

层序遍历所要解决的问题很好理解,就是按二叉树从上到下,从左到右依次打印每个节点中存储的数据。

层序遍历.png

先序遍历:A-->B-->D-->C
中序遍历:B-->D-->A-->C
后序遍历:D-->B-->C-->A
层序遍历:A-->B-->C-->D

题目描述

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

示例1

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

    3
   / \
  9  20
    /  \
   15   7

返回其层序遍历结果:

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

解题思路

1.判断当前root是否存在,不存在返回空数组
2.申明一个queue队列,把树节点压入栈
3.申明一个result,用于返回结果
4.循环队列的左右子树,申明一个temp数组,用于临时保存数据
5.需要保存下queue.length。因为在遍历的过程中,queue弹出栈后,需要把当前节点的左右节点push到队尾,这个时候queue的动态变化

代码

 * Definition for a binary tree node.
 * function TreeNode(val, left, right) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.left = (left===undefined ? null : left)
 *     this.right = (right===undefined ? null : right)
 * }
 */
/**
 * @param {TreeNode} root
 * @return {number[][]}
 */
var levelOrder = function(root) {
    if(!root) return [];
    let queue = [root];
    let result = [];
    while(queue.length){
        let temp = [];
        let size = queue.length;
        for(let i = 0; i < size; i++){
            let n = queue.shift();
            temp.push(n.val);
            n.left && queue.push(n.left);
            n.right && queue.push(n.right);
        }
        result.push(temp);
    }
    return result;
};