我目前正在开发一个类别层次结构,而且我认为创建树横向的重点。但我需要在这个层次结构中添加一个新节点,使用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函数将新节点添加到此树中?
答案 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]');
... }