迭代时如何知道我在树的末尾?

Posted

技术标签:

【中文标题】迭代时如何知道我在树的末尾?【英文标题】:How to know that I'm at the end of tree when iterating? 【发布时间】:2017-12-19 01:18:01 【问题描述】:

我正在为树结构(左子指针、右子指针、父指针)编写(有序)迭代器,但我被卡住了,因为当我已经访问过时,我想不出停止迭代的方法所有节点。如何检查我当前所在的节点是否是树的最后一个节点?

编辑

这里的树结构应该是二叉树结构,我需要中序遍历来实现节点“键”的词汇顺序,并且我已经完成了递归版本 - 我正在尝试做迭代版本,因为很多遍历树的其他函数,我不确定如何编写足够通用的递归版本以支持所有用途。

很抱歉,如果我最初的问题不准确,请按您认为合适的方式投反对票。

【问题讨论】:

还没弄清楚如何用铅笔和纸确定“最后一个节点”,为什么还要写代码? 你知道如何开始迭代了吗?当没有“下一个”节点时停止。所以弄清楚如何找到“下一个”节点。 一个简单的方法是检查当前节点是否是树的最右边的孩子,这将是按顺序遍历的最后一个节点。要找到最右边的孩子,只需从根一直到没有正确的孩子。但是当然,如​​果你确实正确地实现了 FindNextNode 函数,你应该通过检测你是从右孩子返回到 root 还是在 root 之后并且没有右孩子来得出相同的结论。 您是否在编写递归代码? read 【参考方案1】:

如果你是递归做的,这是算法固有的,你不需要手动检查,按照下面的伪代码:

def processTree(node):
    if node == null: return
    processTree(node.left)
    print(node.value)
    processTree(node.right)

processTree(rootNode)

考虑处理最后一个节点的点,例如以下树中的7

    __1__
   /     \
  2       3
 / \     / \
4   5   6   7

此时,您将已经处理了左侧的所有内容和所有父项,因此您只需爬上树并退出。

【讨论】:

问题被标记为 c++,而不是 python。 @Barmar,那是伪代码!如果您避开 lambda 和类似的东西,Python 只是一种理想的伪代码语言。我会澄清的。 C++代码几乎一模一样,只是多了几个大括号,为什么不这样贴出来避免混淆? @Barmar:因为 (1) 我来这里主要是为了教学,而不仅仅是提供插入式代码。 (2) 很少有非家庭作业问题会使用手工构建的树代码,所以家庭作业(或一些教育)几乎可以肯定这是什么。 (3) 现在应该没有混淆,因为我已经明确表示它是伪代码。 任何需要提出此类问题的人可能没有能力将伪代码转换为真实代码。所以你只是替他解决了一个问题。【参考方案2】:

一种方法是在搜索树之前计算节点总数,例如 N。然后您可以使用 size_t counter 对其进行计数,即将 counter 的引用传递给递归调用以进行树搜索,并在每个最终节点上执行++counter

【讨论】:

在不解决原始问题的情况下,如何计算树中的节点数? 节点总数应该是 2^(k-1) 其中 k 是树的层数。对吗? 如何在不遍历树的情况下找到树的层数? 这也假设树是平衡的。 其实是(2^k)-1。查看 paxdiablo 答案中的示例树,它有 3 个级别和 7 个节点。

以上是关于迭代时如何知道我在树的末尾?的主要内容,如果未能解决你的问题,请参考以下文章

如何识别向量迭代器是不是已到达向量末尾?

二叉树的遍历:迭代实现

二叉树的遍历:迭代实现

二叉树的遍历:迭代实现

For 循环的迭代次数少于我在 Python 中的预期

迭代 unordered_map 时如何获取指向键的指针?