Модифицированный обход дерева предзаказа - определение «вершины», когда родитель не указан - PullRequest
1 голос
/ 04 февраля 2009

Я реализую модифицированный класс обхода дерева предзаказов для дерева категорий на веб-сайте, но у меня возникли проблемы с одним сценарием. Обычно при вставке новой категории указывается родительский элемент верхнего уровня, левое значение которого используется в дереве, чтобы определить, где новая категория должна идти в дереве. Однако могут быть случаи, когда родитель не указан, а это означает, что новая категория должна находиться в верхней части дерева, справа от любых других категорий в верхней части дерева.

Глядя на некоторые другие приложения с похожими структурами, многие из них, похоже, вставляют «корневой» узел в дерево во время установки. Мне интересно, так ли это, чтобы им никогда не приходилось определять, является ли это первой вставкой, и у них всегда есть левая ссылка. Любые мысли или псевдокод будет высоко ценится. Я делаю это на PHP, если это имеет значение. Мое дерево может выглядеть примерно так:

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

Я думаю, что в этом сценарии правильное значение Одежды всегда будет наибольшим в таблице, но я не уверен, как использовать это, чтобы определить, является ли оно последним. Любая помощь или советы будут оценены.

Ответы [ 3 ]

2 голосов
/ 04 февраля 2009

В представленном вами примере электроника и одежда технически являются двумя отдельными деревьями, если у них нет общего родителя. Если вы добавите «Моя новая категория», это также новое дерево. Если вы пытаетесь перейти между электроникой, одеждой и моей новой категорией, вам нужно значение выше всех трех, скажите «Все», то есть ваш корневой узел.

См. Хранение иерархических данных в базе данных для примера с перечисленным деревом и примерами или фактического хранения в базе данных.

0 голосов
/ 21 ноября 2009

При вставке. Запустите запрос, заказанный LEFT, возьмите последний, который является вашей последней корневой категорией, назовите его last_tree. Вставляя новое дерево, присвойте ему левое значение last_tree + 1 и правое значение last_tree + 2.

Посмотрите здесь пример CakePHP:

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

0 голосов
/ 11 февраля 2009

Другой очень эффективный способ хранения данных такого типа - Вложенные наборы , он позволяет выполнять много общих операций с одним запросом и устраняет необходимость в рекурсии других схем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...