给定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++ 中的 multimap 容器按升序存储 (key, value)对,根据键排序。对于给定树的每个节点,如果我们将(level, node)放入一个 multimap 中,那么它将存储这些节点根据它们的级别排序。
例如,给定的树是:
对于这棵树,多图看起来像:
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)
如果您想与行业专家一起参加直播课程,请参阅Geeks Classes Live