力扣刷题笔记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;
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值