Создание иерархии обхода дерева с нуля с использованием PHP/MySQL

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

Проблема в том, что функция rebuild_tree была бы достаточно хороша (другими словами, эффективна для больших деревьев).

Пример запроса:

 CREATE TABLE `t_categories`(
   `id` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
   `title` VARCHAR(45) NOT NULL,
   `lft` INTEGER UNSIGNED NOT NULL,
   `rght` INTEGER UNSIGNED NOT NULL,
   PRIMARY KEY (`id`)
 );

 INSERT INTO t_categories (title, lft, rght) VALUES ('Cat 1',1,16);
 INSERT INTO t_categories (title, lft, rght) VALUES ('Cat 2',2,3);
 INSERT INTO t_categories (title, lft, rght) VALUES ('Cat 3',4,7);
 INSERT INTO t_categories (title, lft, rght) VALUES ('Cat 4',5,6);
 INSERT INTO t_categories (title, lft, rght) VALUES ('Cat 5',8,13);
 INSERT INTO t_categories (title, lft, rght) VALUES ('Cat 6',9,12);
 INSERT INTO t_categories (title, lft, rght) VALUES ('Cat 7',10,11);
 INSERT INTO t_categories (title, lft, rght) VALUES ('Cat 8',14,15);

Результаты таблицы выглядят так:

 ID    TITLE   LFT    RGHT
 1     Cat1    1      16
 2     Cat2    2      3
 3     Cat3    4      7
 4     Cat4    5      6
 5     Cat5    8      13
 6     Cat6    9      12
 7     Cat7    10     11
 8     Cat8    14     15

Я привел пример данных выше, но мне нужно также создать совершенно новый узел с нуля.

Итак, как я могу добавить новый узел в это дерево, используя функцию PHP, которая эффективна с большими деревьями?

4 ответа

Это целко дерево. Подход Simpelst будет сначала проходить по глубине дерева и обновлять только левое значение, а затем рекурсивным образом правильное значение. Вставка намного дороже.

Я рекомендую вам добавить поле "родительский идентификатор" в структуру таблицы вместо полей "левый" и "правый". Если важно, чтобы у вас был заказ на товары для детей, используйте также поле int localorder.

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

CREATE TABLE `t_categories`(
   `keyid` INTEGER UNSIGNED NOT NULL,
   `title` VARCHAR(45) NOT NULL,
   `parentid` INTEGER UNSIGNED NOT NULL,
   `sortorder` INTEGER UNSIGNED NOT NULL,
   PRIMARY KEY (`id`)
 );

-- root item, no parent
 INSERT INTO t_categories (keyid, title, parentid, sortorder) VALUES (1, 'Root', 0, 0);

-- first level
 INSERT INTO t_categories (keyid, title, parentid, sortorder) VALUES (2, 'a:', 1, 1);
 INSERT INTO t_categories (keyid, title, parentid, sortorder) VALUES (3, 'b:', 1, 2);
 INSERT INTO t_categories (keyid, title, parentid, sortorder) VALUES (3, 'c:', 1, 3);
 INSERT INTO t_categories (keyid, title, parentid, sortorder) VALUES (4, 'd:', 1, 4);

-- second level

 INSERT INTO t_categories (keyid, title, parentid, sortorder) VALUES (5, 'a:\temp', 2, 1);
 INSERT INTO t_categories (keyid, title, parentid, sortorder) VALUES (6, 'a:\docs'', 2, 2);
 INSERT INTO t_categories (keyid, title, parentid, sortorder) VALUES (7, 'a:\music', 2, 3);

 INSERT INTO t_categories (keyid, title, parentid, sortorder) VALUES (8, 'c:\temp', 4, 1);
 INSERT INTO t_categories (keyid, title, parentid, sortorder) VALUES (9, 'c:\docs'', 4, 2);
 INSERT INTO t_categories (keyid, title, parentid, sortorder) VALUES (10, 'c:\music', 4, 3);

-- and so on

Это же дерево используется компрессией Хаффмана для подсчета появления буквы в данном документе. Я думаю, что для кодирования строки алгоритм затем использует также обход в глубину, чтобы буква с наибольшим количеством вхождений кодировалась с наименьшим возможным битом. Я не знаю, полезно ли это здесь, но наименьшую энтропию текста можно найти, используя теорию Шеннона -log(x)+log(2), где x - буква, а log (2) - база в битах. 2.

Мой предыдущий ответ неполон. Это резюме, весь код должен быть в посте на форуме. Забыли спросить, процедурный PHP или объектно-ориентированный PHP?

MySQL: СОЗДАТЬ ТАБЛИЦУ t_categories(keyid INTEGER НЕ ПОДПИСАНО НЕ НУЛЬ, title VARCHAR (45) НЕ NULL, parentid INTEGER НЕ ПОДПИСАНО НЕ НУЛЬ, sortorder INTEGER НЕ ПОДПИСАН НЕ НУЛЬ, ПЕРВИЧНЫЙ КЛЮЧ (id));

Заголовки функций PHP:

// globar var, действует как тип / * typedef * / treeNodeType = array ("keyid" => 0, "title" => "", "parentid" => 0, "sortorder" => 0,)

// globar var, действует как тип /* typedef */ treeType = array( "root" => nil, "what" => "",)

/ * treeNodeType / function insertNode (/ treeType / ATree, AParentId, ATitle) {...} / void / функция deleteNode (/ treeType * / ATree, AKeyId) {...}

// -> MAIN main ();

/ * void * / function main () {// treeType myTree; myTree = treeType;

// вставляем root = 0 rootNode = insertNode (myTree, 0, '[PC]');

...}

Другие вопросы по тегам