请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。
例如:
给定如下的二叉树
1 | 8 |
返回其层次遍历结果:
1 | [ |
方法一:两个栈
分析:题目要求奇数层按照从左到右的顺序打印,偶数层按照从右到左的顺序打印。
思路:设置两个栈odd和even,odd用于存储奇数层,even用于存储偶数层。
1.如果当前层为奇数层,那么,当odd不为空时,循环执行如下操作:
将栈顶元素出栈。若该节点有左孩子,则将其左孩子压入even中。若该节点还有右孩子,则将右孩子也压入even中。
2.如果当前层为偶数层。那么,当even不为空时,循环执行如下操作:
将栈顶元素出栈。若该节点有右孩子,则将其右孩子压入odd中。若该节点还有左孩子,则将左孩子也压入odd中。
1 | /** |
复杂度分析:时间复杂度和空间复杂度均为O(n)。其中,n为二叉树中节点的个数。
方法二:双端队列
双端队列可以看做是将两个栈的底部拼接在一起构成的。因此,我们也可以使用双端队列来实现方法一。
队首用于存储偶数层,队尾用于存储奇数层。
1 | /** |
复杂度分析:时间复杂度和空间复杂度均为O(n)。其中,n为二叉树中节点的个数。