📜  使用堆栈和多图以螺旋形式遍历级别顺序

📅  最后修改于: 2021-09-03 13:41:14             🧑  作者: Mango

给定N 个节点的二叉树,任务是以螺旋形式打印层序遍历。在螺旋形式中,树的第一层和第二层的节点被正常打印(从左到右),之后交替层的节点以相反的顺序打印。

例子:

天真的方法:
本文已经讨论了解决此问题的一种简单方法。基本思想是使用递归和标志变量,使用它以相反的顺序打印交替级别的节点,最终获得螺旋形式。
时间复杂度: O(N 2 )
辅助空间: O(1)

有效的方法:
在这种方法中,使用了堆栈多重映射。 C++ 中的 multimap 容器按升序存储 (key, value)对,根据键排序。对于给定树的每个节点,如果我们将(level, node)放入一个 multimap 中,那么它将存储这些节点根据它们的级别排序。

例如,给定的树是:

对于这棵树,多图看起来像:

1
     / \
    3   2

该方法的详细步骤如下:

  1. 遍历给定的树并将所有(级别,节点)对插入到一个多重映射中,然后遍历这个多重映射。
  2. 如果级别为奇数,则按节点在多映射中出现的顺序打印节点。
  3. 如果级别为偶数,则将当前级别的所有元素推入堆栈,然后从堆栈中弹出所有元素并打印它们。它给出了相反的顺序。

最后,这种水平顺序遍历将导致所需的螺旋形式。

下面是上述方法的实现:

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