迭代时如何知道我在树的末尾?
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 个节点。以上是关于迭代时如何知道我在树的末尾?的主要内容,如果未能解决你的问题,请参考以下文章