2011-03-07 46 views
1

我目前正在开发一个类别层次结构,并且我认为要创建树的遍历。但是我需要在这个层次结构中添加一个新的节点来使用PHP函数。使用PHP/MySQL从零开始创建树遍历层次结构

问题是,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功能添加一个新的节点到这棵树上,这个功能可以与大型树木一起使用?

+1

,如果你正在寻找管理大型树木的有效方式,那么你最好从嵌套组更好地切换到邻接表 - http://explainextended.com/2009/09/ 24/adjacency-list-vs-nested-sets-postgresql/ – 2011-03-08 12:11:44

+0

@foo:好点但至少90可以关闭案件并选择一个答案。 – Bytemain 2011-03-16 20:04:25

回答

2

这是一棵celko树。 Simpelst方法将深度优先遍历树并只更新左值,然后以递归方式更新正确的值。插入成本更高。

+1

下面是cella如何插入:http://www.ibase.ru/devinfo/DBMSTrees/sqltrees.html – LumpN 2011-03-07 18:38:47

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 
+0

谢谢你的回答,但是你提到的这个方法不是我想要的 - 对我来说这不是更好更快 – dino 2011-03-07 18:36:13

+0

你想如何迭代树,一旦已经存储在表中? – umlcat 2011-03-08 16:03:08

+0

检查如何遍历树检查其他答案,稍后在同一篇文章中 – umlcat 2011-03-16 16:28:33

0

huffman compresssion使用同一棵树来计算给定文档中字母的出现。我认为要对字符串进行编码,然后使用深度优先遍历,以便出现次数最多的字母可以用最少的位进行编码。我不知道这里是否有用,但是使用shannon theorm发现文本的最低熵-log(x)+ log(2)其中x是字母,而log(2)是位的基数,它总是2.

0

我以前的回答不完整。这是一个总结,整个代码很长时间才能在论坛发布。忘了问,程序化PHP还是面向对象的PHP?

MySQL的: CREATE TABLE t_categorieskeyid INTEGER UNSIGNED NOT NULL, title VARCHAR(45)NOT NULL, parentid INTEGER UNSIGNED NOT NULL, sortorder INTEGER UNSIGNED NOT NULL, PRIMARY KEY(id) );

PHP函数标头:

// globar变种,就像一个类型 /*的typedef */treeNodeType =阵列( “KEYID”=> 0, “标题”=> “”, “ parentId的 “=> 0, ”排序顺序“=> 0, )

// globar变种,就像一个类型 /*的typedef */treeType =阵列( ”根“=>零, ” 无论“=>”“, )

/* treeNodeType /功能insertNode(/ treeType /ATREE,AParentId,ATitle){...} /空隙/功能deleteNode(/ treeType */ATREE,AKeyId){...}

// - > MAIN main();

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

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

... }