Database 修改的预订单和仅预订单之间有什么区别?

Database 修改的预订单和仅预订单之间有什么区别?,database,data-structures,tree,Database,Data Structures,Tree,我读过关于树遍历和树数据结构的书,所以我现在知道了什么是前序树遍历,但是我也看到了一种叫做修改后的前序树遍历的东西,但是我发现要找到关于这两者之间的区别的好答案或文档有点困难。有人能对此发表评论吗?我确实找到了一篇关于解释它的文章,但是这个图表看起来很像常规的前序,作者写的唯一一件事是一个节点有两个附加值,我不确定这是否正确 我读到的文章是: 我也看了一遍:但我很难相信作者,他说他是大学经济学专业的学生,写的是关于树结构的文章。 Django的mptt模块是其使用的一个地方: 当我在谷歌上搜索时

我读过关于树遍历和树数据结构的书,所以我现在知道了什么是前序树遍历,但是我也看到了一种叫做修改后的前序树遍历的东西,但是我发现要找到关于这两者之间的区别的好答案或文档有点困难。有人能对此发表评论吗?我确实找到了一篇关于解释它的文章,但是这个图表看起来很像常规的前序,作者写的唯一一件事是一个节点有两个附加值,我不确定这是否正确

我读到的文章是: 我也看了一遍:但我很难相信作者,他说他是大学经济学专业的学生,写的是关于树结构的文章。 Django的mptt模块是其使用的一个地方:


当我在谷歌上搜索时,似乎有好几个地方都在使用这种预排序树遍历的修改版本,所以我发现没有更多的文章来解释这种差异有点奇怪。

我稍微不同意这个命名,也许你方对此有些困惑

我将“遍历”定义为遍历的过程

我们从遍历中得到的结果,我可能称之为“表示”

MPTT与其说是遍历,不如说是表示

此外,左边的值可以被认为是前序,而右边的值可以被认为是后序(我们将讨论…)

因此,我可能更愿意将其命名为“组合前/后顺序遍历表示”


现在看看这到底是什么

如上所述,它只是一个表示

让我们看看从树生成此表示的算法:

traverse(node, index)
   node.left = index

   for each child c of node
     traverse(c, ++index)

   node.right = ++index
从上面的代码可以看出,我们在递归到子节点之前和之后都对节点进行了处理,因此可以将其视为前序和后序遍历的某种组合

现在,这个和前序或后序之间更重要的区别在于它的使用方式

Pre-Order或postorder通常是在树上运行或用于生成树的内容(可能是为了将其紧凑地存储到磁盘,而在实际需要使用树时,可能会在内存中生成典型的基于指针的表示)

但对于MPTT,这将是您在使用它时实际表示树的方式。这在数据库中特别有用,因为数据库并不特别关注递归

您可以将MPTT值存储在表中,这样可以有效地执行各种查询。例如:(派生自)

  • 要获取一个节点的所有子体,需要在该节点的左值和右值之间查找左值

  • 要获取节点的/所有祖先的路径,需要查找左值小于此左值且右值大于此右值的节点


以上两项都可以使用单个查询执行,其中作为递归表示,路径中的每个节点都需要一个查询,并且。。。一些是给后代的。

如果你引用了一篇文章,至少要添加一个链接或引用。“Modified preorder”听起来像是有人为了自己的需要修改了preorder遍历的概念。我看到“Modified preorder tree traversal”这个词有很多地方,所以它似乎被用在了很多地方。我将添加几个链接。谢谢你的回答。结合这些图表,我现在可以看出,这比常规预订单要快得多,效率更高。因此,如果您有一个线程评论系统,例如,您将只执行一个查询,而不是遍历树,这将花费更多的时间。