树结构的通用遍历

Generic traversal of tree structure

本文关键字:遍历 结构      更新时间:2023-10-16

我正在尝试编写我的树(嗯,这是二进制trie)遍历遍历更通用,因为现在的方式是我重复了非常相似的代码。

我在词典中散步树。我认为可以用通用树遍历抽象的功能的示例(在伪代码中):

items(node*, key, list&) {
    if(node->value)
        list.push({node->value, key})
    if(node->left)
        items(node->value, key + "0")
    if(node->right)
        items(node->value, key + "1")
}
draw(node*, id, ostream&) {
    drawNode(node, id)
    if (node->left)
        drawLine(node, node->left, "0", ostream&)
        draw(node->left, ++id, ostream&)
    if (node->right)
        drawLine(node, node->right, "1", ostream&)
        draw(node->right, ++id, ostream&)

我不是在要求使用功能代码,而只是向正确的方向推动。将功能作为参数的模板应该完成吗?那更复杂的情况又如何简单地由单个左/右节点的存在来调节(两个Trie的合并似乎也像是该抽象的候选者)。

遍历的通用抽象是迭代器的合适形式。一旦遍历已成为线性序列,您就可以使用常规迭代器之一来制定它,这很可能是对双向介导器进行建模。当概括树的遍历(或更通用的图形)时,您可能会以不同的方向移动迭代操作。

死灵固定,但如果有人登上这个问题,仍然可能值得。

通用树遍历是由功能编程的理论家研究,最终为Haskell生成了几个可用的库。我将指出递归模板和SYB(废除边框)库。两者都有一篇描述方法的论文。

syb依赖于运行时反射的形式,并使用了很多类型的铸造/胁迫,但是递归式shemes被移植到包括Kotling和Scala在内的几种语言中,因此它们与命令式语言兼容。

这些作品绝不代表了类似树状数据架构的递归遍历可以完成的巅峰之作,但它们看到了一些用途,并且这些想法经过了充分的测试。