我可以在没有堆栈的情况下在二叉搜索树中实现迭代器吗?
Can I implement iterator in binary search tree without stack?
假设我有二叉搜索树。每个节点都有两个指向子节点的指针,没有指向父节点的指针。
有没有有效的方法可以在不使用堆栈或队列的情况下实现迭代器?
我所说的高效是指能够在 O(1( 复杂性中找到下一个元素。
想象一下一棵高度为h的完美树的情况。当迭代器位于第一个节点(最左边的叶子(时,它将需要以某种方式记住它到达该节点的内部节点,因为在接下来的步骤之一中,它将需要生成这些节点(及其右侧子树(中的值。由于没有父节点指针,因此此信息不容易获得,必须存储在某个地方。
无论这条路径是如何记忆的(内部节点列表,或方向列表,如左-左-左-左,可能以位表示形式紧凑存储(,该存储的理论大小为 O(h(。
如下面的注释中所述,仅存储方向将需要在迭代的每一步再次从根开始走路径。或者,您可以记住上次访问的值,并使用二叉搜索来查找下一个节点。如果树中的所有值都是唯一的,则实际值的内存大小将至少与紧凑路径表示形式(按位左-左-左...(具有相同的数量级,因此无论哪种方式(存储路径或上次访问的值(,存储要求都是相似的。
现在,一旦你对树的大小进行了一些限制,谈论空间(或时间(的复杂性当然就没有意义了。例如,如果一棵树的高度永远不会超过 64,那么当前路径可以用 64 位无符号整数表示,也许还有一些额外的小整数来表示该路径的当前大小。
由于可观测宇宙中的原子数量估计为2 250,您也可以使用它,并使用256位无符号整数(两个长整型(。计算机内存永远无法以任何方式存储这种高度的完美树。
总结一下:迭代器应该具有较小的大小(与树大小无关(,并且树节点中也没有其他信息。此外,树可能以任何方式不平衡。
在这种情况下,答案一定是否定的,从鸽子洞原则来看。问题是,在处理完最后一个节点之前,无法预测还剩下多少节点,以及它们之间的关系。从字面上看,有无限的选择,但直接可用的信息是有限的。
- 我可以在没有堆栈的情况下在二叉搜索树中实现迭代器吗?
- 二叉搜索树 - 实现"search"函数
- 二叉搜索树的 C++ 实现中的EXC_BAD_ACCESS错误
- C++二叉搜索树实现不会添加每个元素
- 在C++中实现二叉搜索树,搜索不起作用.尝试打印节点的元素会导致输出崩溃
- C++二叉搜索树实现,动态数组或结构/类
- 二进制搜索树的数组实现
- 二叉搜索树实现C++运行时错误
- C++ 中字符串实现的二叉搜索树
- 二叉搜索树在C++中的实现
- 二叉树搜索的实现和函数声明c++
- C++二进制搜索树的实现
- 在 Java 中实现从预序数组重建二叉搜索树
- 它使用什么样的二进制搜索树来实现“std::set”
- 在我的二叉搜索树实现中找不到指针错误?
- 2-3搜索树在c++中的实现
- 二叉搜索树实现.编译的问题
- 使用模板和unique_ptr实现的二叉搜索树中返回具有最小值的节点
- 用栈实现二叉搜索树的非递归析构
- 二叉搜索树实现(c++)