【问题标题】:Modified preorder tree traversal - determining the "top" when no parent is specified修改前序树遍历 - 在没有指定父节点时确定“顶部”
【发布时间】:2010-10-05 10:07:32
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: language-agnostic modified-preorder-tree-t


    【解决方案1】:

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

    请参阅Storing Hierarchical Data in a Database 以获取具有枚举树和示例或数据库中的实际存储的示例。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 我的简短研究表明,嵌套集与前序树遍历相同。嵌套集有什么不同或优势,还是只是一种不同的可视化编号树节点的方式?
      【解决方案3】:

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

      看看这里的 cakephp 示例:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-23
        • 2011-02-10
        • 2011-12-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-17
        • 1970-01-01
        相关资源
        最近更新 更多