给定N个节点的二叉树,任务是以螺旋形式打印级别顺序遍历。以螺旋形式,正常(从左到右)打印树的第一层和第二层的节点,然后以相反的顺序打印交替层的节点。
例子:
Input: N = 3
Output: 1 3 2
Explanation:
Nodes at level 0 printed in normal order (1)
Nodes at level 1 printed in normal order (3, 2)
Hence, spiral order is (1, 3, 2)
Input: N = 5
Output: 10 20 30 60 40
Explanation:
Nodes at level 0 printed in normal order (10)
Nodes at level 1 printed in normal order (20, 30)
Nodes at level 2 printed in reverse order (60, 40)
Hence, spiral order is (10, 20, 30, 60, 40)
天真的方法:
本文已经讨论了针对此问题的幼稚方法。基本思想是使用递归和标志变量,使用该变量以相反的顺序打印交替级别的节点,并最终获得螺旋形式。
时间复杂度: O(N 2 )
辅助空间: O(1)
高效方法:
在这种方法中,使用了堆栈和多图。 C++中的多图容器以升序存储(键,值)对,并按键排序。对于给定树的每个节点,如果我们将(级别,节点)放入多图,则它将存储根据其级别排序的这些节点。
例如,给定的树是:
对于这棵树,多图看起来像:
1
/ \
3 2
此方法的详细步骤如下:
- 遍历给定的树并将所有(级别,节点)对插入多图,然后遍历此多图。
- 如果级别为奇数,请按节点在多图上的显示顺序打印。
- 如果级别是偶数,则将当前级别的所有元素推入堆栈,然后从堆栈中弹出所有元素并进行打印。它给出相反的顺序。
最后,这种水平顺序遍历将导致所需的螺旋形式。
下面是上述方法的实现:
10
/ \
20 30
/ \
40 60
Key(Level) Value(Element)
0 1
1 2
1 3
2 7
2 6
2 5
2 4
时间复杂度: O(NlogN)
辅助空间: O(N)