【问题标题】:Algorithm for creating Iterator for BinaryTree class为 BinaryTree 类创建迭代器的算法
【发布时间】:2012-01-22 14:03:24
【问题描述】:

我想在我的参数化 BinaryTree 类中添加双向迭代器(如 std::set 导出的迭代器),但我无法提出任何算法。

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

【问题讨论】:

  • 到目前为止你有什么?
  • @qwertymk 到目前为止,我有带有 insert()、preorderDisplay()、deleteNode() 的二叉树类

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


【解决方案1】:

对于给定的结构,您希望像这样继续:

  1. 要开始迭代,您会找到最左边的节点。
  2. 要转到下一个节点,操作取决于您当前所在的位置:
    1. 如果您的节点有一个右子节点,则转到该子节点并找到其最左边的后继节点(如果没有左子节点,则您所在的节点是下一个节点)。
    2. 如果您的节点没有右子节点,则向上移动父节点链,直到找到使用左节点链接的父节点:下一个节点成为此节点。
  3. 要向另一个方向移动,您需要颠倒左右的角色。

实际上,这实现了树的无堆栈中序遍历。如果您的树在迭代时没有更改(不太可能发生的情况),或者您没有到父节点的链接,您可以在迭代器中显式维护堆栈。

【讨论】:

  • 2.2 如果您的节点没有右子节点,您将向上移动父节点链直到找到您使用左节点链接的父节点
  • @Mr.Anubis:我的意思是:从当前节点看父节点。如果当前节点是父节点的右子节点,则将父节点设为当前节点并检查其专利。如果当前节点是父节点的左子节点,父节点就是你停止的地方。看到这一点的最好方法是绘制二叉树(奇怪地倒挂):从子树中最右边的节点开始,您需要一直向上走,直到有一个节点有另一个子树挂在它的正确的孩子或没有正确的孩子。当然,最终还有更多的节点。
  • 啊,现在知道了,非常感谢您的帮助,谢谢
【解决方案2】:

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

只是一个想法。

【讨论】:

    【解决方案3】:

    您不能使用递归在 C++ 中实现迭代器,因为您的迭代器需要从所有处理过程中返回,然后才能返回结果。

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

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

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

    1. 继续向左下走
    2. 每次遇到正确的分支时,将其添加到堆栈中
    3. 如果您在任何时候都无法向左移动,请将第一个分支从堆栈中弹出并以相同的方式开始访问它。

    【讨论】:

    • 其实如果有父节点的链接,就不需要在迭代器中维护栈。此外,如果您确实在迭代器中维护了一个堆栈,那么您将在迭代时阻止对树结构的更改。
    • 你能解释一下yield的概念吗?
    • 这里有yield的解释:stackoverflow.com/questions/231767/…。
    猜你喜欢
    • 2019-05-30
    • 2016-09-23
    • 2016-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-20
    • 1970-01-01
    相关资源
    最近更新 更多