题目

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

思路

在这里我们如果单纯的使用队列去弄的话,会很麻烦,所有这里我们使用栈结构来实现,如下图所示,我们打印的顺序应该是:1、3、2、4、5、6。

(1)我们先把1压入到一个栈(stack1),然后取出1,这时我们把他的左右节点放到另一个栈里(stack2),因为是先打印3再2,所以我们应该从左到右压。

(2)我们拿到刚才压2和3的栈(stack2),因为3在栈顶,所以先取出3打印,然后打印2,打印的同时也要把当前节点左右节点压入到另一个栈(stack1),因为先取出的是3,所以我们把3的左子节点压入栈,然后再压2的子节点,因为是打印顺序是456,所以我们从右到左。

如果当两个栈都为空时,代表当前所有的节点都打印完了,所以结束。

代码如下:

public class Offer32 {
public static class TreeNode {
int val;
TreeNode left;
TreeNode right; TreeNode(int x) {
val = x;
}
} public static void printTree(TreeNode root) {
if (root == null) {
return;
}
Stack<TreeNode> stack1 = new Stack<>();
Stack<TreeNode> stack2 = new Stack<>();
int index = 2;
stack1.push(root);
while (stack1.size() > 0 || stack2.size() > 0) {
TreeNode cur = null;
while (index % 2 == 0 && stack1.size() > 0) {
// stack2负责压入层数为偶数的节点
cur = stack1.pop();
System.out.println("树节点" + cur.val);
// 先压左再压右
if (cur.left != null) {
stack2.push(cur.left);
}
if (cur.right != null) {
stack2.push(cur.right);
}
}
while (index % 2 != 0 && stack2.size() > 0) {
// stack1负责压入层数为奇数的节点
cur = stack2.pop();
System.out.println("树节点" + cur.val);
// 先压右再压左
if (cur.right != null) {
stack1.push(cur.right);
}
if (cur.left != null) {
stack1.push(cur.left);
}
}
index++;
}
}
}

  

最新文章

  1. 算法入门笔记------------Day4
  2. sed 指令
  3. CSS“反转”为LESS
  4. POJ3267 The Cow Lexicon(dp)
  5. vmware9安装centos和Mac经验总结
  6. st-Spanning Tree
  7. Python之路: 模版篇
  8. 我眼中的ASP.NET Core之微服务
  9. java快速排序详解
  10. C语言实现二叉树的基本操作
  11. Day3--------------目录文件的浏览、管理及维护
  12. 关于Jedis是否线程安全的测试
  13. fisheye Error occurred during initialization of VM Could not reserve enough space for object heap 问题解决!
  14. 设置ubuntu 终端显示路径长度
  15. asp.net 网站在Apache下的配置,就这么简单
  16. 第三篇 Python关于mysql的API--pymysql模块, mysql事务
  17. 20145328 《Java程序设计》实验二实验报告
  18. thinkphp5集成微信支付【公众号支付】快捷路径
  19. Python入门-初始函数
  20. 关于JavaScript的push()函数

热门文章

  1. 02 前端之css
  2. 【Java面试题】解释内存中的栈(stack)、堆(heap)和静态存储区的用法
  3. 什么是DDoS攻击?
  4. ab测试工具的使用
  5. 【异常】Reason: Executor heartbeat timed out after 140927 ms
  6. &lt;现代C++实战30讲&gt;笔记 01 | 堆、栈、RAII:C++里该如何管理资源?
  7. tomcat访问日志
  8. Kattis - bitwise Bitwise (RMQ+尺取+树上dfs)
  9. BZOJ1257 [CQOI2007]余数之和[规律]
  10. Struts2基本原理【转】