题⽬描述

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

示例1 输⼊:{8,6,10,5,7,9,11} 返回值:[[8],[10,6],[5,7,9,11]]

思路及解答

双向链表(推荐)

  1. 借助双向链表,初始化⼀个添加⽅向 boolean 值,先将根节点添加进去:

  2. 获取 list ⾥⾯剩下的元素的个数,挨个取出就是⼀层,取出的时候,如果 reverse 为 true,则往链表的第 0 个索引位置添加,否则直接在后⾯添加,然后判断每⼀个取出来的节点的左右节点是不是为空,不为空则加⼊链表。

  3. 每⼀层处理完之后,将 list 加⼊结果集中,然后翻转 reverse 的值,继续判断 list 是不是为空,执⾏第⼆步循环。

  • 空间复杂度由于借助了额外的 list,为 O(n)

  • 时间复杂度,由于每个节点进⼊队列⼜出来,为 O(2n),也是 O(n) 。

队列 + 方向反转

这是最直接的方法。我们进行标准的层序遍历,但用一个标志位记录当前层是奇数层还是偶数层。对于偶数层,我们在将该层的节点值列表加入最终结果前,先进行反转

  • 时间复杂度:O(n)。每个节点被访问一次,对于偶数层,Collections.reverse的时间复杂度为 O(当前层节点数),所有层的节点数相加为 n,因此总时间复杂度为 O(n)。

  • 空间复杂度:O(n)。队列和结果列表所需空间与节点数 n 成线性关系。

双栈交替

利用栈后进先出(LIFO)的特性来自然地实现顺序的反转。我们使用两个栈,一个用于处理当前层,另一个用于存储下一层的节点

  • 时间复杂度:O(n)。每个节点被压入栈和弹出栈各一次。

  • 空间复杂度:O(n)。两个栈在最坏情况下共同存储 n 个节点。