为BinaryTree类创建迭代器的算法

时间:2012-01-22 14:03:24

标签: c++ data-structures iterator binary-tree

我想在我的Parametrized BinaryTree类中添加Bi-Directional Iterator(就像std :: set导出的Iterator),但是我无法使用任何算法。

二元树节点的简单结构是,它包含三个指针,左,右,父:

Node Structure

3 个答案:

答案 0 :(得分:5)

使用给定的结构,您希望如下进行:

  1. 要开始迭代,您会找到最左侧的节点。
  2. 要转到下一个节点,操作取决于您当前的位置:
    1. 如果你的节点有一个正确的孩子,你会去找这个孩子并找到它最左边的后继者(如果没有左孩子,你所在的节点就是下一个节点。)
    2. 如果您的节点没有正确的子节点,则向上移动父节点链,直到找到您使用了左节点链接的父节点:下一个节点将成为此节点。
  3. 要向另一个方向移动,您可以反转左右角色。
  4. 实际上,这实现了树的无堆栈有序遍历。如果您的树在迭代时没有被更改(不太可能的情况),或者您没有到父节点的链接,则可以在迭代器中显式维护堆栈。

答案 1 :(得分:1)

解决此问题的一个好方法可能是首先编写递归预订算法,而不使用模板,然后您可以从中创建模板化版本并实现正确的迭代器。

只是一个想法。

答案 2 :(得分:0)

您不能使用递归在C ++中实现迭代器,因为迭代器需要在返回结果之前从所有处理返回。

只有具有yield概念的C#和Python等语言才能使用递归来创建迭代器。

您的迭代器需要维护一堆尚未访问的节点。

在我的头脑中,我认为算法类似于:

  1. 继续往下走,
  2. 每次遇到正确的分支时,将其添加到堆栈
  3. 如果在任何时候你不能向左走,请从堆栈中弹出第一个分支,然后以同样的方式开始访问它。