1

我正在为网站上的类别树实现一个修改后的预排序树遍历类,但是我在一个场景中遇到了麻烦。通常在插入新类别时会指定顶级父级,其在树中的左值用于确定新类别在树中的位置。但是,有时可能没有指定父类,这意味着新类别必须进入树的顶部,位于树顶部的任何其他类别的右侧。

查看其他一些具有类似结构的应用程序,其中许多似乎在安装时在树中插入了一个“根”节点。我想知道这是不是这样他们就不必检测它是否是第一个插入,并且他们总是有一个左参考。任何想法或伪代码将不胜感激。如果重要的话,我会在 PHP 中执行此操作。我的树可能看起来像这样:

Electronics         Apparel         My New Category
    / \               / \
MP3     TVs    Shirts     Shoes

我的想法是,在这种情况下,Apparel 的正确值将始终是表中最大的,但我不确定如何使用它来确定它是最后一个。任何帮助或提示将不胜感激。

4

3 回答 3

2

在您提供的示例中,如果没有共同的父级,Electronics 和 Apparel 在技术上是两个独立的树。如果您添加“我的新类别”,它也是一棵新树。如果您尝试在 Electronics、Apparel 和 My New Category 之间进行遍历,您需要一个高于所有三个的值,例如“All”,即您的根节点。

有关枚举树和示例或数据库中实际存储的示例,请参阅将分层数据存储在数据库中。

于 2009-02-04T15:58:39.240 回答
0

存储此类数据的另一种非常有效的方法是使用嵌套集,它只允许一个查询进行许多常见操作,并且无需递归其他方案。

于 2009-02-10T23:58:27.887 回答
0

插入时。运行查询,按 LEFT 排序,取最后一个,即你的最后一个根类别,称之为 last_tree。插入新树时,给它一个左值 last_tree + 1 和右值 last_tree + 2。

在这里查看一个 cakephp 示例:

http://bakery.cakephp.org/articles/view/modified-preorder-tree-traversal-component

于 2009-11-21T08:52:15.413 回答