2011-03-07 45 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]');

... }