力扣刷题笔记day9(从上到下打印二叉树)

第一种(左到右的顺序打印)

从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印。

题目

在这里插入图片描述

思路

按照同一层从左到右的顺序打印,因此使用广度优先遍历,先将同一层的遍历完,再遍历下一层的。要实现树的广度优先遍历策略,需要借助队列先进先出的特点,不然每次都还是会做成深度优先,树的左右节点性质就决定了每次会先遍历左节点

代码

var levelOrder = function(root) {
    
    
    let res = [];
    if(!root) {
    
    
        return res;
    }
    // 初始化队列
    let queue = [root]
    // 跳出条件,队列为空,即所有节点都遍历完成
    while(queue.length) {
    
    
        // 拿出队首节点
        let node = queue.shift();
        res.push(node.val);
        if(node.left) {
    
    
            queue.push(node.left)
        }
        if(node.right) {
    
    
            queue.push(node.right)
        }
    }
    return res
};

第二种(每层打印到一行)

从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行。

题目

在这里插入图片描述

思路

比起第一种,第二种最后输出是一个类似二维的数组,所以肯定是需要双重循环。在第二重循环里面需要定义一个变量,用来存放一层的数据。

代码

var levelOrder = function(root) {
    
    
    let res =[]
    if(!root){
    
    
        return res
    }
    let queue = [];
    queue.push(root)
    while(queue.length>0){
    
    
        let len=queue.length;
        let tempArr = []
        for(let i =0; i<len;i++){
    
    
            let nodes = queue.shift()
            tempArr.push(nodes.val);
            if(nodes.left){
    
    
                queue.push(nodes.left)
            }
            if(nodes.right){
    
    
                queue.push(nodes.right)
            }
        }
        res.push(tempArr);
    }
    return res
};

第三种(第一层由左到右第二层由右到左)

请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。

题目

在这里插入图片描述

思路

相比较第二种,就是将双层的level时数组进行倒序。

代码

var levelOrder = function(root) {
    
    
  if (!root) return [];
    let queue = [root];
    let res = [];
    let level = 0; // 代表当前层数
    while (queue.length) {
    
    
        res[level] = []; // 第level层的遍历结果
        let levelNum = queue.length; // 第level层的节点数量
        while (levelNum--) {
    
    
            const front = queue.shift();
            res[level].push(front.val);
            if (front.left) queue.push(front.left);
            if (front.right) queue.push(front.right);
        }
        // 行号是偶数时,翻转当前层的遍历结果
        if (level%2) {
    
    
            res[level].reverse();
        }

        level++;
    }
    return res;
};

猜你喜欢

转载自blog.csdn.net/weixin_51610980/article/details/128431120