是否可以使用迭代而不是递归来迭代二叉树?

时间:2014-03-23 18:37:47

标签: c++ recursion tree iteration

在学校,当我们需要遍历树(例如二叉搜索树)时,我们总是被教导以递归方式遍历树。

由于每次重复都可以写成迭代,是否可以单独使用迭代来访问树的元素?

我在C ++的上下文中问这个问题

4 个答案:

答案 0 :(得分:3)

对于您处理的每个节点,将子项存储到队列中。对于同一级别中的其余节点,这种情况继续存在。处理该级别中的所有节点后,您将处理排队的子节点。反过来,您将孩子的孩子存储到队列中。这种情况一直持续到你触底。

例如以下内容:

      D
  B       F 
A   C   E   G

// 1
Current: D
Queue: B, F

// 2
Current: B, F
Queue: A, C, E, G

// 3
Current: A, C, E, G
Queue: no more!

迭代比递归复杂得多,因为你需要实现一个队列(如果没有提供)以及一些非平衡树的附加逻辑。但是,迭代更“内存友好”,因为你的队列只是一堆指向节点的指针,而递归会在每次调用时占用堆栈。

答案 1 :(得分:0)

是。存在一种名为threading的树的方法,它基本上以特定的遍历顺序连接节点。因此,您可以迭代遍历整个树,就像任何其他递归遍历一样。

答案 2 :(得分:0)

答案是肯定的。

这取决于你想要做什么样的遍历(预购,有序,后序)。如果要复制递归行为,则需要模拟堆栈递归。 它可能在一些场景中很有用,但递归更简单。

答案 3 :(得分:0)

std::setstd::map最常见的实现是红黑树;两者都可以只用两个迭代器迭代(通过调用beginend获得);因此,不仅可以在没有递归的情况下进行迭代,甚至可以在O(1)空间中进行迭代,只要树的结构正确。

树有多种表示形式:

  • 父级访问子级:父级可能有一个指向第一个子级的指针,一个指向第一个和最后一个子级的指针或一个指向每个子级的指针数组
  • 子级访问父级:子级可能有也可能没有指向其父级的指针
  • 兄弟姐妹访问:孩子可能有也可能没有指向其前任和继任者的指针

一般来说,如果:

  • 一个孩子有一个指向其父级的指针
  • 可以访问父母的第一个孩子并知道您何时到达最后一个孩子

然后你可以在O(1)空间中实现迭代;你甚至可能选择在孩子之前,中间或之后“拜访”父母。