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

📅  最后修改于: 2021-05-05 02:11:26             🧑  作者: Mango

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

例子:

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

高效方法:
在这种方法中,使用了堆栈多图。 C++中的多图容器以升序存储(键,值)对,并按键排序。对于给定树的每个节点,如果我们将(级别,节点)放入多图,则它将存储根据其级别排序的这些节点。

例如,给定的树是:

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

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)