【js--树】JZ77 按之字形顺序打印二叉树

这篇博客介绍了如何实现二叉树的之字形层序遍历。通过使用层序遍历的方法并结合标志变量flag来切换左右方向,将每层节点按特定顺序保存到结果数组中。在遍历过程中,利用shift和pop操作来依次处理节点,并根据flag值决定先处理左子节点还是右子节点。最后,将每一层的节点值存入结果数组res中,形成之字形的遍历序列。
摘要由CSDN通过智能技术生成

描述
给定一个二叉树,返回该二叉树的之字形层序遍历,(第一层从左向右,下一层从右向左,一直这样交替)

基本思想:
使用层序遍历的思想,再稍微做些修改。
首先使用一个变量flag标识遍历的方向
将每一层的节点存入一个数组arr中。
如果是从左向右遍历,则shift出来一个个节点保存它的值。推入孩子节点时使用push,并且先push左子节点,再push右子节点(因为接下来该从右向左了)
如果是从右向左遍历,则pop出来一个个节点保存它的值。推入子节点时使用unshift,并且先unshift右子节点,再unshift左子节点(因为接下来该从左向右了)

注:
shift是删除数组第一个元素,改变原数组,可保留删除节点的值;
pop是删除数组最后一个元素,改变原数组,可保留删除节点的值

/* function TreeNode(x) {
    this.val = x;
    this.left = null;
    this.right = null;
} */
function Print(pRoot)
{
    // write code here
    //层序遍历
    //主要思想:先把每一层节点入栈,然后再挨个遍历出来,让它的子节点入栈
    if(!pRoot) return [];
    const res = [];  //存储结果,里面存放的对象是节点数组
    const arr = [];  //存放节点,
    arr.push(pRoot);
    //flag:作为一个标记,true从左向右,flase从右向左
    let flag = true;
    while(arr.length>0){
        //每一层遍历完,都需要list数组重置,size也要重新赋值
        let list = [];
        let size = arr.length;
        //size的设置是为了将每一层在数组中的节点遍历完毕,当它为0时,则意味着这一层的节点的孩子节点已经放入arr中,可以变换flag、并将list数组放入res中
        while(size>0){
            //定义一个空节点,来接收被删除的父节点
            let node;
            //从左到右遍历
            if(flag){
                //shift() 方法用于把数组的第一个元素从其中删除,并返回第一个元素的值,第一次:node是pRoot,此时arr数组为空
                node = arr.shift();
                if(node.left) arr.push(node.left);
                if(node.right) arr.push(node.right);
            }else{
                //pop删除数组最后一个元素
                node = arr.pop();
                //将其孩子节点加入到数组,将新节点添加到数组开头
                if(node.right) arr.unshift(node.right);
                if(node.left) arr.unshift(node.left);
            }
            list.push(node.val);
            size--;
        }
        flag = !flag;
        res.push(list)
    }
    return res
}
module.exports = {
    Print : Print
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值