使用PHP / MySQL从头开始创建树遍历层次结构

时间:2011-03-07 18:07:35

标签: php mysql tree traversal rebuild

我目前正在开发一个类别层次结构,而且我认为创建树横向的重点。但我需要在这个层次结构中添加一个新节点,使用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 个答案:

答案 0 :(得分:2)

这是一棵celko树。最简单的方法是深度优先遍历树并仅更新左值,然后以递归方式更新正确的值。插入费用更高。

答案 1 :(得分:2)

我建议您在表结构中添加“父ID”字段,而不是“左”和“右”字段。如果它对您有重要的子项目订单,请使用“localorder”int字段。

使用当前结构,每次要添加项目时,您必须检查第一项是否有前一项,并检查最后一项是否有最终项目。

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

答案 2 :(得分:0)

huffman compresssion使用相同的树来计算给定文档中字母的出现次数。我认为编码一个字符串算法然后也使用深度优先遍历,以便具有最多出​​现次数的字母用尽可能少的位编码。我不知道它是否在这里有用但是使用shannon theorm -log(x)+ log(2)找到文本的最低熵,其中x是字母,log(2)是以位为单位的基数2。

答案 3 :(得分:0)

我之前的回答是不完整的。这是一个总结,整个代码很长时间都在论坛帖子中。忘了询问,程序化PHP或面向对象的PHP?

MySQL的:     CREATE TABLE t_categories(        keyid INTEGER UNSIGNED NOT NULL,        title VARCHAR(45)NOT NULL,        parentid INTEGER UNSIGNED NOT NULL,        sortorder INTEGER UNSIGNED NOT NULL,        主要关键(id)      );

PHP函数头:

// globar var,就像一个类型 / * typedef * / treeNodeType = array(   “keyid”=> 0,   “title”=> “”   “parentid”=> 0,   “sortorder”=> 0, )

// globar var,就像一个类型 / * typedef * / treeType = array(   “root”=>零,   “不管”=> “” )

/ * treeNodeType / function insertNode(/ treeType / ATree,AParentId,ATitle){...} / void / function deleteNode(/ treeType * / ATree,AKeyId){...}

// - >主要 主();

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

//插入root = 0   rootNode = insertNode(myTree,0,'[PC]');

... }