题目描述

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

题目分析

这道题还是需要画图分析,不然不好找规律。

正常的广度遍历的话,都是同样的顺序,从左到右,而我们要在广度遍历的基础上改造为之字形遍历。

也就是我们需要在奇数行从左至右,在偶数行从右至左,因为是先进后出,分析可得我们需要的数据结构是栈。

为了避免顺序错误,我们需要的不只是一个栈,而是两个栈,这个大家画图研究下就能想到。

两个栈是这么用的,这个栈保存这一行的数据,另一个栈保存下一行的数据,然后一行打印完后交替。

当然也有人是在广度遍历的基础上加个临时数组,然后对偶数行的数据reverse也可以做,但是我觉得reverse效率太低,所以就不打算写这种方法了。

代码

function Print(pRoot) {
const lists = []; if (pRoot === null) {
return lists;
} const stack1 = [];
const stack2 = []; stack2.push(pRoot);
let i = 1;
while (stack1.length !== 0 || stack2.length !== 0) {
const list = []; // 为奇数层
if ((i & 1) === 1) {
while (stack2.length !== 0) {
const tmp = stack2[stack2.length - 1];
stack2.pop();
list.push(tmp.val);
if (tmp.left !== null) stack1.push(tmp.left);
if (tmp.right !== null) stack1.push(tmp.right);
}
}
// 为偶数层
else {
while (stack1.length !== 0) {
const tmp = stack1[stack1.length - 1];
stack1.pop();
list.push(tmp.val);
if (tmp.right !== null) stack2.push(tmp.right);
if (tmp.left !== null) stack2.push(tmp.left);
}
}
++i;
lists.push(list);
}
return lists;
}

剑指offer(59)按之字形顺序打印二叉树的更多相关文章

  1. 剑指Offer 59. 按之字形顺序打印二叉树 (二叉树)

    题目描述 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推. 题目地址 https://www.nowco ...

  2. [剑指Offer] 59.按之字形顺序打印二叉树

    题目描述 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推. [思路]先按层次遍历存入,通过设立标志位,将 ...

  3. 【剑指Offer】按之字形顺序打印二叉树 解题报告(Python)

    [剑指Offer]按之字形顺序打印二叉树 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-intervie ...

  4. 剑指offer系列34----按之字形顺序打印二叉树

    [题目]请实现一个函数按照之字形打印二叉树, * 即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印, * 其他行以此类推. 未优化,不是最优解,博主用的是队列 ...

  5. 剑指offer:按之字形顺序打印二叉树(Python)

    题目描述 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推. 解题思路 先给定一个二叉树的样式: 前段时间 ...

  6. 剑指offer---3、按之字形顺序打印二叉树

    剑指offer---3.按之字形顺序打印二叉树 一.总结 一句话总结: |||-begin 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照 ...

  7. 剑指offer59:按之字形顺序打印二叉树:[[1], [3,2], [4,5,6,7]]

    1 题目描述 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推. 2 思路和方法 先给定一个二叉树的样式: ...

  8. 剑指offer 按之字型顺序打印二叉树

    题目描述 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推.   使用两个栈进行存储,我们在打印某一行节点 ...

  9. 《剑指offer》从上往下打印二叉树

    本题来自<剑指offer> 从上往下打印二叉树 题目: 从上往下打印出二叉树的每个节点,同层节点从左至右打印. 思路: 队列的思想. 先将根节点加入,当取该节点时候,依次将左右子树加入,直 ...

  10. 【剑指Offer】从上往下打印二叉树 解题报告(Python)

    [剑指Offer]从上往下打印二叉树 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-interviews ...

随机推荐

  1. js中 函数声明/函数表达式/匿名函数/箭头函数/立即执行函数

    函数声明: function add(a, b) { // ... } 1.顾名思义,声明一个函数, 用关键字 “function” 来告诉,这是一个函数. 2.任何地方,想用就可以拿过来使用 函数表 ...

  2. 接口自动化测试 (三)request.post

    上一节介绍了  requests.get()  方法的基本使用,本节介绍  requests.post()  方法的使用: 本文目录: 一.方法定义 二.post方法简单使用 1.带数据的post 2 ...

  3. 方程式ETERNALBLUE 之fb.py的复现

    原文链接:https://www.t00ls.net/viewthread.php?tid=39343

  4. Node.js的进程管理

    众所周知Node基于V8,而在V8中JavaScript是单线程运行的,这里的单线程不是指Node启动的时候就只有一个线程,而是说运行JavaScript代码是在单线程上,Node还有其他线程,比如进 ...

  5. 创建一个抽象的员工类, 抽象开发累继承员工类,JavaEE ,和安卓继承开发类在测试类中进行测试

    /* 1 定义一个员工类  所有的子类都抽取(抽象类)  Employee            属性:姓名  工号(生成get  set  )       方法:工作  抽象     2 定义一个研 ...

  6. 微信小程序开发笔记01

    微信小程序开发的优势 1,不用安装,即开即用,用完就走.省流量,省安装时间,不占用桌面: 2,体验上虽然没法完全媲美原生APP,但综合考虑还是更优: 3,对于小程序拥有者来说,开发成本更低,他们可以更 ...

  7. arcmap发布服务报错:“Faild to publish service”

    发布gp服务时,Analyze没有重大错误,但是发布结束时提示"Faild to publish service".让人很懵逼: 解决方法: 打开arcgis server man ...

  8. [Day12]构造方法、关键字this、super

    1.构造方法:对象创建时要执行的方法 (1)构造方法的格式: 修饰符 构造方法名(参数列表){} 体现: a.构造方法没有返回值类型,也不需要返回值 b.构造方法名称必须和类型保持一致 c.构造方法没 ...

  9. DELPHI中完成端口(IOCP)的简单分析(3)

    DELPHI中完成端口(IOCP)的简单分析(3)   fxh7622关注4人评论7366人阅读2007-01-17 11:18:24   最近太忙,所以没有机会来写IOCP的后续文章.今天好不容易有 ...

  10. Object.keys()的理解

    Object.keys(obj) 方法会返回一个由一个给定对象的自身可枚举属性组成的数组,数组中属性名的排列顺序和使用 for...in 循环遍历该对象时返回的顺序一致. 例子如下: ①.简单的数组( ...