题目描述:

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

  解题思路:

  这道题仍然是二叉树的遍历,相当于层次遍历,可以和第22题:从上往下打印二叉树 和第60题:把二叉树打印成多行 这几个题对比起来进行分析。

  相对而言,本题按之字形顺序打印二叉树是比较复杂的,短时间内不太好分析得到结论,可以通过具体的实例来进行分析,从具体的例子得出普遍的结论。

![](https://img2018.cnblogs.com/blog/1608161/201905/1608161-20190520124535402-538247061.png)

  实际上,层次遍历我们都是借助一定的数据容器来实现的,比如按行打印使用的是队列。在本题,我们使用的是栈,具体分析如下:我们可以设置两个辅助栈,在打印某一层的结点时,将下一层的子结点保存到相应的栈里;如果当前打印的是奇数层(第一层、第三层等),则先保存左子节点再保存右子结点到第一个栈中,如果当前打印的是偶数层(第二层、第四层等),则先保存右子结点再保存左子结点到第二个栈中。

  举例:

![](https://img2018.cnblogs.com/blog/1608161/201905/1608161-20190520124608363-2020615468.png)

  编程实现(Java):

import java.util.ArrayList;
import java.util.Stack;
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null; public TreeNode(int val) {
this.val = val;
}
}
public class Solution {
public ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
/*
思路:之字形打印,用两个栈来实现
打印奇数行时,将他的左右节点保存到另一个栈中,先左后右
打印偶数行时,同样将左右节点保存到栈中,先右后左
*/
ArrayList<ArrayList<Integer>> res=new ArrayList<>();
if(pRoot==null)
return res;
Stack[] stack=new Stack[2]; //stack[0]保存偶数层,stack[1]保存奇数层,注意java不支持泛型数组
stack[0]=new Stack();
stack[1]=new Stack();
TreeNode root=pRoot;
stack[1].push(root);
int num=1; //当前打印的是第几层
while((!stack[0].isEmpty())||(!stack[1].isEmpty())){ //有一个栈不为空
int flag=num%2; //当前要打印的栈
//int save=flag==0?1:0; //下一层保存在这个栈中
ArrayList<Integer> row=new ArrayList<>();
while(!stack[flag].isEmpty()){
TreeNode temp=(TreeNode)stack[flag].pop();
if(flag==1) { //当前是奇数行
if(temp.left!=null)
stack[0].push(temp.left);
if(temp.right!=null)
stack[0].push(temp.right);
}else{ //当前是偶数行
if(temp.right!=null)
stack[1].push(temp.right);
if(temp.left!=null)
stack[1].push(temp.left);
}
row.add(temp.val);
}
res.add(row);
num++;
}
return res;
} }

【剑指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. stl变易算法(三)

    本篇接着前面stl变易算法(一)和stl变易算法(二)继续讲述变易算法. 这里将介绍完余下的变易算法,主要有:填充fill.n次填充fill_n.随机生成元素generate.随机生成n个元素gene ...

  2. Java 构造时成员初始化的陷阱

    1.首先列出代码 Base.java public class Base { Base() { preProcess(); } void preProcess() {} } Derived.java ...

  3. Codeforces--629B--Far Relative’s Problem(模拟)

    Far Relative's Problem Time Limit: 2000MS   Memory Limit: 262144KB   64bit IO Format: %I64d & %I ...

  4. iOS社会化分享(干货)

    一.苹果原生集成的社会化分享 1.哪些平台 (1)Twitter (2)FaceBook (3)Flickr (4)Vimeo (5)新浪微博  :iOS6 (6)腾讯微博 : iOS7 2.框架 : ...

  5. Flink之DataStreamAPI入门

    目录 Types Transformations Defining UDFs 本文API基于Flink 1.4 def main(args: Array[String]) { // 第一种会自动判断用 ...

  6. CMS内容管理系统 -- WorkSpace

  7. C# 标准命名规范

    笔者从事开发多年,有这样一种感觉,查看一些开源项目,如Spring.Apache Common等源码是一件赏心悦目的事情,究其原因,无外两点:1)代码质量非常高:2)命名特别规范(这可能跟老外的英语水 ...

  8. var的变量提升的底层原理是什么?

    原理:JS引擎的工作方式是①先解析代码,获取所有被声明的变量:②然后在运行.也就是专业来说是分为预处理和执行两个阶段. 变量提升的定义:所有变量的声明语句都会被提升到代码头部,这就是变量提升. 例如: ...

  9. ACM_小明滚出去?(求逆序数)

    小明滚出去? Time Limit: 2000/1000ms (Java/Others) Problem Description: 老师:“小明,写一个排序算法”: 小明: void mysort(i ...

  10. 日期Date和String/Long之间的转换

    下面是关于日期的常见的几种类型转换: import java.text.ParseException; import java.text.SimpleDateFormat; import java.u ...