我可以在没有堆栈的情况下在二叉搜索树中实现迭代器吗?

Can I implement iterator in binary search tree without stack?

本文关键字:搜索树 实现 迭代器 堆栈 情况下 我可以      更新时间:2023-10-16

假设我有二叉搜索树。每个节点都有两个指向子节点的指针,没有指向父节点的指针。

有没有有效的方法可以在不使用堆栈或队列的情况下实现迭代器?

我所说的高效是指能够在 O(1( 复杂性中找到下一个元素。

想象一下一棵高度为h的完美树的情况。当迭代器位于第一个节点(最左边的叶子(时,它将需要以某种方式记住它到达该节点的内部节点,因为在接下来的步骤之一中,它将需要生成这些节点(及其右侧子树(中的值。由于没有父节点指针,因此此信息不容易获得,必须存储在某个地方。

无论这条路径是如何记忆的(内部节点列表,或方向列表,如左-左-左-左,可能以位表示形式紧凑存储(,该存储的理论大小为 O(h(。

如下面的注释中所述,仅存储方向将需要在迭代的每一步再次从根开始走路径。或者,您可以记住上次访问的值,并使用二叉搜索来查找下一个节点。如果树中的所有值都是唯一的,则实际值的内存大小将至少与紧凑路径表示形式(按位左-左-左...(具有相同的数量级,因此无论哪种方式(存储路径或上次访问的值(,存储要求都是相似的。

现在,一旦你对树的大小进行了一些限制,谈论空间(或时间(的复杂性当然就没有意义了。例如,如果一棵树的高度永远不会超过 64,那么当前路径可以用 64 位无符号整数表示,也许还有一些额外的小整数来表示该路径的当前大小。

由于可观测宇宙中的原子数量估计为2 250,您也可以使用它,并使用256位无符号整数(两个长整型(。计算机内存永远无法以任何方式存储这种高度的完美树。

总结一下:迭代器应该具有较小的大小(与树大小无关(,并且树节点中也没有其他信息。此外,树可能以任何方式不平衡。

在这种情况下,答案一定是否定的,从鸽子洞原则来看。问题是,在处理完最后一个节点之前,无法预测还剩下多少节点,以及它们之间的关系。从字面上看,有无限的选择,但直接可用的信息是有限的。