預(yù)排序遍歷數(shù)算法

轉(zhuǎn)的地址忘了碟贾,如有侵權(quán)請@

預(yù)排序遍歷樹算法

現(xiàn)在讓我們看一看另外一種不使用遞歸計算锐墙,更加快速的方法织咧,這就是預(yù)排序遍歷樹算法(modified preorder tree traversal algorithm) 這種方法大家可能接觸的比較少八秃,初次使用也不像上面的方法容易理解薛闪,但是由于這種方法不使用遞歸查詢算法,有更高的查詢效率吱抚。

我們首先將多級數(shù)據(jù)按照下面的方式畫在紙上百宇,在根節(jié)點Food的左側(cè)寫上 1 然后沿著這個樹繼續(xù)向下 在 Fruit 的左側(cè)寫上 2 然后繼續(xù)前進,沿著整個樹的邊緣給每一個節(jié)點都標(biāo)上左側(cè)和右側(cè)的數(shù)字秘豹。最后一個數(shù)字是標(biāo)在Food 右側(cè)的 18携御。 在下面的這張圖中你可以看到整個標(biāo)好了數(shù)字的多級結(jié)構(gòu)。(沒有看懂既绕?用你的手指指著數(shù)字從1數(shù)到18就明白怎么回事了啄刹。還不明白,再數(shù)一遍凄贩,注意移動你的手指)誓军。

這些數(shù)字標(biāo)明了各個節(jié)點之間的關(guān)系,"Red"的號是3和6疲扎,它是 "Food" 1-18 的子孫節(jié)點昵时。 同樣,我們可以看到 所有左值大于2和右值小于11的節(jié)點 都是"Fruit" 2-11 的子孫節(jié)點


這樣整個樹狀結(jié)構(gòu)可以通過左右值來存儲到數(shù)據(jù)庫中椒丧。繼續(xù)之前债查,我們看一看下面整理過的數(shù)據(jù)表。


注意:由于"left"和"right"在 SQL中有特殊的意義瓜挽,所以我們需要用"lft"和"rgt"來表示左右字段。 另外這種結(jié)構(gòu)中不再需要"parent"字段來表示樹狀結(jié)構(gòu)征绸。也就是 說下面這樣的表結(jié)構(gòu)就足夠了久橙。

SELECT * FROM tree WHERE lft BETWEEN 2 AND 11;


看到了吧,只要一個查詢就可以得到所有這些節(jié)點管怠。為了能夠像上面的遞歸函數(shù)那樣顯示整個樹狀結(jié)構(gòu)淆衷,我們還需要對這樣的查詢進行排序。用節(jié)點的左值進行排序:

SELECT * FROM tree WHERE lft BETWEEN 2 AND 11 ORDER BY lft ASC;

那么某個節(jié)點到底有多少子孫節(jié)點呢渤弛?很簡單祝拯,子孫總數(shù)=(右值-左值-1)/2

descendants = (right – left - 1) / 2 ,如果不是很清楚這個公式,那就去翻下書佳头,我們在上數(shù)據(jù)結(jié)構(gòu)寫的很清楚鹰贵!

添加同一層次的節(jié)點的方法如下:

LOCK TABLES nested_category WRITE;

SELECT @myRight := rgt

FROM nested_category

WHERE name = 'Cherry';

UPDATE nested_category

SET rgt = rgt + 2

WHERE rgt > @myRight;

UPDATE nested_category

SET lft = lft + 2

WHERE lft > @myRight;

INSERT INTO nested_category (name, lft, rgt)

VALUES ('Strawberry', @myRight + 1, @myRight + 2);

UNLOCK TABLES;

添加樹的子節(jié)點的方法如下:

LOCK TABLES nested_category WRITE;

SELECT @myLeft := lft

FROM nested_category

WHERE name = 'Beef';

UPDATE nested_category

SET rgt = rgt + 2

WHERE rgt > @myLeft;

UPDATE nested_category

SET lft = lft + 2

WHERE lft > @myLeft;

INSERT INTO nested_category (name, lft, rgt)

VALUES ('charqui', @myLeft + 1, @myLeft + 2);

UNLOCK TABLES;

每次插入節(jié)點之后都可以用以下SQL進行查看驗證:

SELECT CONCAT(REPEAT(' ', COUNT(parent.name) - 1), node.name) AS name

FROM nested_category node, nested_category parent

WHERE node.lft BETWEEN parent.lft AND parent.rgt

GROUP BY node.name

ORDER BY node.lft;

刪除節(jié)點的方法,稍微有點麻煩是有個中間變量,如下:

LOCK TABLES nested_category WRITE;

SELECT @myLeft := lft, @myRight := rgt

, @myWidth := rgt - lft + 1

FROM nested_category

WHERE name = 'Cherry';

DELETE FROM nested_category

WHERE lft BETWEEN @myLeft AND @myRight;

UPDATE nested_category

SET rgt = rgt - @myWidth

WHERE rgt > @myRight;

UPDATE nested_category

SET lft = lft - @myWidth

WHERE lft > @myRight;

UNLOCK TABLES;

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末康嘉,一起剝皮案震驚了整個濱河市碉输,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌亭珍,老刑警劉巖敷钾,帶你破解...
    沈念sama閱讀 222,807評論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異肄梨,居然都是意外死亡阻荒,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,284評論 3 399
  • 文/潘曉璐 我一進店門众羡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來侨赡,“玉大人,你說我怎么就攤上這事纱控×菊保” “怎么了?”我有些...
    開封第一講書人閱讀 169,589評論 0 363
  • 文/不壞的土叔 我叫張陵甜害,是天一觀的道長舶掖。 經(jīng)常有香客問我,道長尔店,這世上最難降的妖魔是什么眨攘? 我笑而不...
    開封第一講書人閱讀 60,188評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮嚣州,結(jié)果婚禮上鲫售,老公的妹妹穿的比我還像新娘。我一直安慰自己该肴,他們只是感情好情竹,可當(dāng)我...
    茶點故事閱讀 69,185評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著匀哄,像睡著了一般秦效。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上涎嚼,一...
    開封第一講書人閱讀 52,785評論 1 314
  • 那天阱州,我揣著相機與錄音,去河邊找鬼法梯。 笑死苔货,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播夜惭,決...
    沈念sama閱讀 41,220評論 3 423
  • 文/蒼蘭香墨 我猛地睜開眼姻灶,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了滥嘴?” 一聲冷哼從身側(cè)響起木蹬,我...
    開封第一講書人閱讀 40,167評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎若皱,沒想到半個月后镊叁,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,698評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡走触,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,767評論 3 343
  • 正文 我和宋清朗相戀三年晦譬,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片互广。...
    茶點故事閱讀 40,912評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡敛腌,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出惫皱,到底是詐尸還是另有隱情像樊,我是刑警寧澤,帶...
    沈念sama閱讀 36,572評論 5 351
  • 正文 年R本政府宣布旅敷,位于F島的核電站生棍,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏媳谁。R本人自食惡果不足惜涂滴,卻給世界環(huán)境...
    茶點故事閱讀 42,254評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望晴音。 院中可真熱鬧柔纵,春花似錦、人聲如沸锤躁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,746評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽系羞。三九已至郭计,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間觉啊,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,859評論 1 274
  • 我被黑心中介騙來泰國打工沈贝, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留杠人,地道東北人。 一個月前我還...
    沈念sama閱讀 49,359評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像嗡善,于是被迫代替她去往敵國和親辑莫。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,922評論 2 361

推薦閱讀更多精彩內(nèi)容