【JavaScript题解】剑指 Offer 32 - III. 从上到下打印二叉树 III

算法题解——保姆级注释


今天做了一道剑指offer的二叉树基础题,在这里分享一下自己的题解
首先来看看题目
请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。 例如: 给定二叉树: [3,9,20,null,null,15,7],如图

在这里插入图片描述

返回其层次遍历结果:

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

来源:力扣(LeetCode)
链接:点击跳转


下面是我的答案:
/**
 * Definition for a binary tree node.
 * function TreeNode(val) {
 *     this.val = val;
 *     this.left = this.right = null;
 * }
 */
/**
 * @param {TreeNode} root
 * @return {number[][]}
 */
var levelOrder = function(root) {
    if(!root) return [];                       //先判断特殊情况,没有根节点直接返回空数组
    let res = [], n = [root], tick = false;    //定义一个返回结果数组,一个树的装载数组,和一个标记
    while(n.length){                           //遍历树的所有节点(节点是在循环中边取出便存入装载数组的)
        let temp = [];                         //该数组用来缓存结果的每一行
        for(let i = n.length; i>0; i--){       //以长度为初始值遍历,防止过程中装载数组长度变化影响遍历
            const a = n.shift();               //把一行里的树节点从左往右取出(相当于从起前面弹出)
            tick?temp.unshift(a.val):temp.push(a.val); //根据标记判断节点值存入缓存数组的方向(顺序)
            a.left && n.push(a.left);                  //如果左子节点存在,将其存入装载数组(此时相当于存入新的一行)
            a.right && n.push(a.right);                //如果右子节点存在,将其存入装载数组(从左往右的顺序存入)
        }                                              //树的这一行节点已经遍历完,新存入的下一行节点会在下次遍历
        res.push(temp);                                //将缓存数组存入结果数组
        tick = !tick;                                  //标记置反,下一行的结果存入顺序改变
    }                                                  //一个周期结束,开始下一个周期,进行树的下一行遍历
    return res;                                        //不要忘了返回最终的结果数组
};

因为在遍历二叉树的过程中,用来当作树节点载体的数组是同时进行取出和存入的,所以长度一直在动态变化,用它来做为循环的终止条件很容易出错,这里就用其作为初始值来循环,避免了这个问题。另外遍历方向的改变可以通过放置一个在循环中不断置反的标记来判断,再用push和unshift不同的存入顺序来实现。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值