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

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

编辑

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

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

【问题讨论】:

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

标签: c++ algorithm tree trie


【解决方案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 个节点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-03-18
  • 2020-09-07
  • 1970-01-01
  • 1970-01-01
  • 2015-10-01
  • 1970-01-01
  • 2010-09-27
相关资源
最近更新 更多