![e4dceca590f21dedf9c47edd463bbd54.png](https://i-blog.csdnimg.cn/blog_migrate/e8fe024582991e48b1f9400deecf4066.jpeg)
题目描述
请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。
分析
拿到这道题目,首先我们可以确定的是应该用层次遍历法遍历二叉树,所以在解题之前我们先来回顾一下基于广度优先的二叉树的遍历是怎样的
![a7b642f36a44bcedf0384d4a27c89eb9.png](https://i-blog.csdnimg.cn/blog_migrate/8d90236dc1dbb14f1ae5ce09cce0fe3e.jpeg)
顺便贴上层次遍历法遍历二叉树的代码
public
错误示范
接下来我们分析这道题目,本道题其实和基本的层次遍历很像,只是当层数为奇数的时候是从左到右遍历,当层数为偶数的时候是从右到左遍历(自顶向下计数),所以我们容易想到的办法是能不能用一个全局层数计数器,当奇数层的时候,我们先添加左节点再添加右节点;当为偶数层的时候,我们先添加右节点再添加左节点
(ps:这是错误方法)
public
通过用例测试我们发现了用一个队列无法实现,count并不能记录层数的奇偶性
正确示范
接下来我们采用两个栈来分别存储相邻两层的节点
- 先将第一层压入栈stack2
- 然后将stack2中的元素依次出栈,并将其中的元素的左->右节点分别压入栈stack1
- 同理,stack1的元素依次出栈,并将其中的元素的右->左节点依次压入栈stack2
- 依次循环
具体如下图所示
![7e25fbc1b80b0f103b095db22e86b7f4.png](https://i-blog.csdnimg.cn/blog_migrate/be2098607510ddbe1a85954992765f36.jpeg)
具体实现
public
参考
《剑指offer纪念版》