我需要为trie实现一个迭代器。假设我有
a
/\
b c
/\
d e
如果当前iterator.state =“abd”,我想让iterator.next.state =“abe”,然后是“ac”。在每个级别,节点按字典顺序排序(例如,在级别2上,c
在b
之后。这也应该在log(n)时间内发生,其中n是节点数。
我能想到的一个解决方案是:考虑一个特殊情况,当每个分支具有相同的高度时。我认为一个相当酷的实现是为每个“级别”维护一个平衡的树。在询问:“在abd之后跟随什么字符串”,当位于b时,可以在与第三级相关联的树中搜索大于“b”的第一个元素,给出“abe”。
然而,由于必须创建树木,这可能是不切实际的。
答案 0 :(得分:0)
如果我正确理解了这个问题,迭代器状态可以是当前字符串和指向trie中当前位置的指针。然后,移动到下一个元素:
如果您当前的位置有兄弟,请移动到它并将当前字符串中的最后一个字符替换为当前位置的字符。
否则,删除最后一个字符并上到树中。如果你试图从根本上升,你就完成了。否则,请转到步骤1.
所以例如当你在abd(在你的例子中)时,当前字符串是“abd”而指针指向'd'。要移动到下一个元素,将字符串更改为“ab”,移动到兄弟节点('e')并将其添加到字符串中,产生“abe”。在那之后,你会上升,因为没有兄弟,然后是兄弟,产生正确的下一个值'ac'。
正如您所看到的,在最糟糕的情况下,每个步骤都需要在找到兄弟之前一直回到根目录;那是你要求的日志(n)。