【温故知新】`102. 二叉树的层序遍历` 广度优先遍历、队列先进先出的原则

470 阅读2分钟

题目描述

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

 

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

    3
   / \
  9  20
    /  \
   15   7
返回其层序遍历结果:

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


来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/binary-tree-level-order-traversal
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路

广度优先遍历

层序遍历类似:二叉树的最大深度104

  • 特殊情况优先处理
  • 层序遍历利用queue队列的先进先出的原则
  • 定义队列queue并初始化为根节点root;
    • 遍历队列queue
      • 我们定义levelNum为当前层级的节点数量;定义temp存储当前层级的容器数组;
      • 通过queue.shift()操作,每次取出队列头部元素node.并将node.val压入数组temp;
      • 判断当前节点node是否存在left左孩子节点,如果存在,则进入queue队列,作为下一层级队列元素;
      • 同理: 判断当前节点node是否存在right右孩子节点;
      • levelNum--;当前层级遍历终止条件为:levelNum===0;
      • 每一轮层级遍历结束,将统计元素temp数组压入栈result;
    • 返回result;

代码

/**
 * Definition for a binary tree node.
 * class TreeNode {
 *     val: number
 *     left: TreeNode | null
 *     right: TreeNode | null
 *     constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) {
 *         this.val = (val===undefined ? 0 : val)
 *         this.left = (left===undefined ? null : left)
 *         this.right = (right===undefined ? null : right)
 *     }
 * }
 */

function levelOrder(root: TreeNode | null): number[][] {
    let result :number[][]=[];
    
    if(!root){
        return result
    }
    let queue=[root] // 将队列初始化为root;
    while(queue.length>0){ // 利用队列先进先出的原则进行出入队;
        let levelNum=queue.length,temp:number[]=[];
        // 层序遍历节点;
        while(levelNum>0){
            let node:TreeNode =queue.shift();
            temp.push(node.val)
            if(node.left!==null){
                queue.push(node.left)
            }
            if(node.right!==null){
                queue.push(node.right);
            }
            levelNum--
        }// end of level  while 
        result.push(temp);

    }// end of queue while 

    return result;
    
};

二叉树相关回顾

【温故知新】101. 对称二叉树 利用队列、递归实现二叉树的判断