修改前订单和预订订单之间有什么区别?

时间:2014-04-23 14:47:16

标签: database data-structures tree

我已经阅读了关于树遍历和树数据结构的内容,所以我现在知道预订树遍历是什么,但我也看到有一种称为修改的预订树遍历,但我发现它有点难以找到关于这两者之间的区别是什么的好答案或文件。有人可以对此发表评论吗?我确实发现了一篇关于解释它的文章,但该图看起来类似于常规预订,作者写的唯一内容是节点有两个附加值,我不确定这是否正确。

我读过的文章:http://imrannazar.com/Modified-Preorder-Tree-Traversal 我也仔细研究了这个问题:http://www.sitepoint.com/hierarchical-data-database-2/但是我很难相信作者说他是大学写作树形结构的经济学专业。 Django的mptt模块是其使用的一个地方:http://django-mptt.github.io/django-mptt/overview.html#what-is-modified-preorder-tree-traversal

当我在google上搜索时,似乎这个预订树遍历的修改版本被用在了几个地方,所以我觉得有些奇怪的是没有更多文章可以解释这些差异。

1 个答案:

答案 0 :(得分:1)

我对命名略有不同意见,也许你的方面存在一些混淆。

我定义"遍历"作为遍历的过程。

我们从遍历中获得的结果我可能会调用"表示"

MPTT更像是一种表现而不是遍历。

此外,左边的值可以被认为是预订,而右边的值可以被认为是后序(我们会得到那个......)。

因此我可能更喜欢将它命名为"组合前/后序遍历表示"


现在实际上是什么。

如上所述,它只是一种表现形式。

让我们看一个算法从树中生成这种表示:

traverse(node, index)
   node.left = index

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

   node.right = ++index

从上面的代码中可以看出,我们在递归到子节点之前和之后对节点做了一些事情,因此它可以看作是前后遍历的某种组合。

现在,这个与售前或售后订单之间的重大差异在于它是如何使用的。

预订或后序通常是您在树上运行或用于生成树的东西(可能将其紧凑地存储到磁盘,而当您实际想要使用时,可能会在内存中生成典型的基于指针的表示树)。

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

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

  • 要获取节点的所有后代,您需要在该节点的左右值之间查找左侧值。

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

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