【发布时间】:2018-05-20 23:38:04
【问题描述】:
如果我对平衡 BST 从最小值到最大值进行了中序遍历,我会使用一个 DFS,它维护一个大小为 lg(n) 的堆栈。但是如果我需要找到任意节点的中序后继,这是最坏情况下的 lg(n) 操作。但是如果我想按顺序迭代,id 需要为每个节点重复找到中序后继,产生 O(n*lg(n))。 std::set 是否使用了一些技巧进行中序迭代,还是真的花费 O(n*lg(n)),或者时间成本是否以某种方式摊销?
【问题讨论】:
-
我认为通常树的每个节点除了左右节点指针之外还包含一个指向父节点的指针。因此,引用特定节点的迭代器可以在树中以任何需要的方式导航,以获得下一个值(或上一个值)。
-
是的,我也考虑过这一点,但是现在你有了一个指向父节点的指针,一个指向每个子树的指针,现在每个节点还有两个指针要存储在下一个和上一个节点上。每个节点的内存损失增加了 66%。另外,删除和插入以及可能的重新平衡变得复杂但仍然可行。所以是的,好的,这是一个空间权衡,以避免痛苦的迭代,但是,我想知道是否有一些更好的技巧“他们”使用“免费”或线性摊销
-
您不需要 next 和 prev 指针。使用父指针,计算下一个/上一个是摊销的常数时间。