亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學(xué)院 > 邏輯算法 > 正文

php:樹形結(jié)構(gòu)的算法 2

2024-09-08 23:18:45
字體:
供稿:網(wǎng)友
  1 food 18
  |
  +---------------------------------------+
  | |
  2 fruit 11 12 meat 17
  | |
  +------------------------+ +---------------------+
  | | | |
  3 red 6 7 yellow 10 13 beef 14 15 pork 16
  | |
  4 cherry 5 8 banana 9
  
  這樣整個(gè)樹狀結(jié)構(gòu)可以通過左右值來存儲(chǔ)到數(shù)據(jù)庫中。繼續(xù)之前,我們看一看下面整理過的數(shù)據(jù)表。
  
  
  +-----------------------+-----+-----+
  | parent | name | lft | rgt |
  +-----------------------+-----+-----+
  | | food | 1 | 18 |
  | food | fruit | 2 | 11 |
  | fruit | red | 3 | 6 |
  | red | cherry | 4 | 5 |
  | fruit | yellow | 7 | 10 |
  | yellow | banana | 8 | 9 |
  | food | meat | 12 | 17 |
  | meat | beef | 13 | 14 |
  | meat | pork | 15 | 16 |
  +-----------------------+-----+-----+
  注意:由于"left"和"right"在 sql中有特殊的意義,所以我們需要用"lft"和"rgt"來表示左右字段。 另外這種結(jié)構(gòu)中不再需要"parent"字段來表示樹狀結(jié)構(gòu)。也就是 說下面這樣的表結(jié)構(gòu)就足夠了。
  
  +------------+-----+-----+
  | name | lft | rgt |
  +------------+-----+-----+
  | food | 1 | 18 |
  | fruit | 2 | 11 |
  | red | 3 | 6 |
  | cherry | 4 | 5 |
  | yellow | 7 | 10 |
  | banana | 8 | 9 |
  | meat | 12 | 17 |
  | beef | 13 | 14 |
  | pork | 15 | 16 |
  +------------+-----+-----+
  好了我們現(xiàn)在可以從數(shù)據(jù)庫中獲取數(shù)據(jù)了,例如我們需要得到"fruit"項(xiàng)下的所有所有節(jié)點(diǎn)就可以這樣寫查詢語句: select * from tree where lft between 2 and 11; 這個(gè)查詢得到了以下的結(jié)果。
  
  
  +------------+-----+-----+
  | name | lft | rgt |
  +------------+-----+-----+
  | fruit | 2 | 11 |
  | red | 3 | 6 |
  | cherry | 4 | 5 |
  | yellow | 7 | 10 |
  | banana | 8 | 9 |
  +------------+-----+-----+
  看到了吧,只要一個(gè)查詢就可以得到所有這些節(jié)點(diǎn)。為了能夠像上面的遞歸函數(shù)那樣顯示整個(gè)樹狀結(jié)構(gòu),我們還需要對這樣的查詢進(jìn)行排序。用節(jié)點(diǎn)的左值進(jìn)行排序:
  
  select * from tree where lft between 2 and 11 order by lft asc;
  剩下的問題如何顯示層級(jí)的縮進(jìn)了。
  
  <?php
  function display_tree($root)
  {
  // 得到根節(jié)點(diǎn)的左右值
  $result = mysql_query('select lft, rgt from tree '.'where name="'.$root.'";');
  $row = mysql_fetch_array($result);
  
  // 準(zhǔn)備一個(gè)空的右值堆棧
  $right = array();
  
  // 獲得根基點(diǎn)的所有子孫節(jié)點(diǎn)
  $result = mysql_query('select name, lft, rgt from tree '.
  'where lft between '.$row['lft'].' and '.
  $row['rgt'].' order by lft asc;');
  
  // 顯示每一行
  while ($row = mysql_fetch_array($result))
  {
  // only check stack if there is one
  if (count($right)>0)
  {
  // 檢查我們是否應(yīng)該將節(jié)點(diǎn)移出堆棧
  while ($right[count($right)-1]<$row['rgt'])
  {
  array_pop($right);
  }
  }
  
  // 縮進(jìn)顯示節(jié)點(diǎn)的名稱
  echo str_repeat(' ',count($right)).$row['name']."n";
  
  // 將這個(gè)節(jié)點(diǎn)加入到堆棧中
  $right[] = $row['rgt'];
  }
  }
  ?>
  如果你運(yùn)行一下以上的函數(shù)就會(huì)得到和遞歸函數(shù)一樣的結(jié)果。只是我們的這個(gè)新的函數(shù)可能會(huì)更快一些,因?yàn)橹挥?次數(shù)據(jù)庫查詢。 要獲知一個(gè)節(jié)點(diǎn)的路徑就更簡單了,如果我們想知道cherry 的路徑就利用它的左右值4和5來做一個(gè)查詢。
  
  select name from tree where lft < 4 and rgt > 5 order by lft asc;
  這樣就會(huì)得到以下的結(jié)果:
  
  +------------+
  | name |
  +------------+
  | food |
  | fruit |
  | red |
  +------------+
  那么某個(gè)節(jié)點(diǎn)到底有多少子孫節(jié)點(diǎn)呢?很簡單,子孫總數(shù)=(右值-左值-1)/2 descendants = (right – left - 1) / 2 不相信?自己算一算啦。用這個(gè)簡單的公式,我們可以很快的算出"fruit 2-11"節(jié)點(diǎn)有4個(gè)子孫節(jié)點(diǎn),而"banana 8-9"節(jié)點(diǎn)沒有子孫節(jié)點(diǎn),也就是說它不是一個(gè)父節(jié)點(diǎn)了。
  很神奇吧?雖然我已經(jīng)多次用過這個(gè)方法,但是每次這樣做的時(shí)候還是感到很神奇。
  
  這的確是個(gè)很好的辦法,但是有什么辦法能夠幫我們建立這樣有左右值的數(shù)據(jù)表呢?這里再介紹一個(gè)函數(shù)給大家,這個(gè)函數(shù)可以將name和parent結(jié)構(gòu)的表自動(dòng)轉(zhuǎn)換成帶有左右值的數(shù)據(jù)表。
  
  
  <?php
  function rebuild_tree($parent, $left) {
  // the right value of this node is the left value + 1
  $right = $left+1;
  
  // get all children of this node
  $result = mysql_query('select name from tree '.
  'where parent="'.$parent.'";');
  while ($row = mysql_fetch_array($result)) {
  // recursive execution of this function for each
  // child of this node
  // $right is the current right value, which is
  // incremented by the rebuild_tree function
  $right = rebuild_tree($row['name'], $right);
  }
  
  // we've got the left value, and now that we've processed
  // the children of this node we also know the right value
  mysql_query('update tree set lft='.$left.', rgt='.
  $right.' where name="'.$parent.'";');
  
  // return the right value of this node + 1
  return $right+1;
  }
  ?>
  當(dāng)然這個(gè)函數(shù)是一個(gè)遞歸函數(shù),我們需要從根節(jié)點(diǎn)開始運(yùn)行這個(gè)函數(shù)來重建一個(gè)帶有左右值的樹
  
  rebuild_tree('food',1);
  這個(gè)函數(shù)看上去有些復(fù)雜,但是它的作用和手工對表進(jìn)行編號(hào)一樣,就是將立體多層結(jié)構(gòu)的轉(zhuǎn)換成一個(gè)帶有左右值的數(shù)據(jù)表。

注冊會(huì)員,創(chuàng)建你的web開發(fā)資料庫,
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
中文字幕高清在线免费播放| 香蕉成人在线| 日本不卡二区高清三区| 青青草av专区| 亚洲电影成人av99爱色| 色欲欲www成人网站| 亚洲一二三四五六区| 久久午夜电影网| 久久精品久久精品国产大片| 国产成人三级视频| 成年人黄色电影| 久久在精品线影院精品国产| 久久久99精品免费观看| aaa国产精品视频| 在线视频在线视频7m国产| 色男人天堂综合再现| 高清国产免费| 日本少妇一区二区| 日韩和的一区二在线| 亚洲精品国产偷自在线观看| 欧美一区二区三区婷婷月色| 五十度飞在线播放| av成人免费网站| 一区二区三区久久久| 在线观看亚洲| 日本一二三视频| 二区在线视频| 中文字幕亚洲欧美| 成人免费网站视频www| 在线成人私人影院| 7799精品视频天天看| 亚洲国产日韩一区| 亚洲色图美腿丝袜| 久久亚洲捆绑美女| 日韩欧美综合| 色综合久久88色综合天天提莫| 中文字幕在线亚洲三区| 特级西西444www高清大视频| 黑人巨大精品欧美一区免费视频| 久草视频手机在线观看| 91精品久久久久久久久久入口| 在线日韩电影| 国产午夜三区视频在线| 洋洋成人永久网站入口| 色开心亚洲综合| 欧美偷窥清纯综合图区| 在线免费色视频| 欧美精选视频一区二区| 国产大片中文字幕在线观看| 天天射天天干天天| 国产成人无码精品久在线观看| 欧美福利一区二区| 色欧美88888久久久久久影院| 巨乳诱惑日韩免费av| 中国女人一级一次看片| 亚洲精品久久久一区二区三区| 国产精品偷乱一区二区三区| 亚洲精品小视频| 在线观看91精品国产入口| 日本美女一级片| 天堂a中文在线| 亚洲高清成人| 亚洲波多野结衣| 一级黄色片免费看| 国产精品亚洲激情| 国产精品久久久久久久午夜片| 日本精品视频一区| 国产麻豆午夜三级精品| 久久精品国产亚洲7777| 国产在线色视频| 国产精品久久久毛片| 2020日本在线视频中文字幕| 青青青青国产视频| 永久久久久久久| 日本一级大毛片a一| 黄色在线播放网站| 国产免费一区二区三区免费视频| 久草在线官网| 国产91绿帽单男绿奴| 三级影片在线观看欧美日韩一区二区| 四虎激情影院| 三上悠亚在线观看视频| 黑人精品一区二区| 91福利在线观看视频| 欧美一区二区精品在线| 五十路熟女丰满大屁股| 一级特黄大欧美久久久| 亚洲精品喷潮一区二区三区| brazzers在线观看| www.青青草| 亚洲一区3d动漫同人无遮挡| 久久出品必属精品| 中文字幕在线观看一区| 欧洲乱码伦视频免费| 色偷偷www8888| 99视频有精品高清视频| 婷婷亚洲天堂| 国产精品久久一区主播| 国产在线观看中文字幕| 亚洲啊v在线免费视频| 在线观看午夜av| 美女在线观看视频一区二区| 一女二男3p波多野结衣| 77777少妇光屁股久久一区| 成人黄色免费视频| 欧美日本一区二区高清播放视频| 日韩国产激情| 黑人久久a级毛片免费观看| 在线观看视频污| 国产精品视频一区二区三区综合| 人人做人人澡人人爽欧美| 国产一区二区导航在线播放| 无码aⅴ精品一区二区三区浪潮| 欧美性高潮床叫视频| 成人黄色生活片| 狠狠久久伊人| 免费永久在线观看黄网| 秋霞午夜鲁丝一区二区老狼| 一区二区久久久久| 可以在线观看的黄色| 一个人在线视频免费观看www| 草莓污污视频在线观看| 亚洲精品20p| 亚洲色图欧美色| 一区二区三区日韩视频| 久久99精品国产91久久来源| 欧美日韩激情视频在线观看| 国产精品免费大片| 精品一区二区三区影院在线午夜| 欧美一区二区三区喷汁尤物| 久久精品视频日本| 久久国产毛片| 亚洲国产日韩av| 亚洲精品.com| 日韩在线欧美在线| 九九热视频在线免费观看| 在线亚洲午夜片av大片| 成人免费av网站| 亚洲狠狠丁香婷婷综合久久久| 欧美一区永久视频免费观看| 欧洲精品一区色| 欧美久久久影院| 伊人av电影| 亚洲精品成人天堂一二三| 天天操夜夜操视频| xvideos入口| 一区二区三区在线资源| 亚洲最大的成人网| 在线免费国产视频| 亚洲精品合集| 亚洲一二三四五六区| 日韩中文字幕一区二区高清99| 波多野结衣中文在线| 在线日韩日本国产亚洲| 老司机午夜网站| 无码一区二区精品| 91蝌蚪九色| 日韩欧美精品在线观看视频| 高清不卡一区二区| 日韩精品一区二区三区中文| 97视频在线播放| 成人黄色三级视频| 成人黄18免费网站| 国产乱理伦片在线观看夜一区| 欧美一区二区三区四区在线观看地址| 欧美日韩国产一区| 在线观看日韩毛片| 在线播放一级片| 少妇精品久久久| 国产精品蜜月aⅴ在线| 91成人小视频| 亚洲免费观看高清| 久久久久成人网| 久久躁日日躁aaaaxxxx| 欧美日韩亚州综合| 在线观看精品| 97人澡人人添人人爽欧美| 亚洲欧洲在线免费| 欧美一区二区三区婷婷月色| 一个人看的www在线免费视频| 伊人中文字幕在线观看| 午夜精品久久久久久久99黑人| heyzo亚洲| 黑人巨大精品欧美一区二区三区| 国产精品视频h| 男人天堂999| 欧美电影在线观看完整版| 久久久精品有限公司| 在线成人黄色| 在线观看v片| 欧美成人一区二区三区电影| 国产精品一在线观看| 麻豆精品蜜桃| 欧日韩在线观看| 美女又爽又黄免费动漫| 鲁一鲁一鲁一鲁一色| 伊人久久高清| 含羞草激情视频| 先锋影音av资源在线| 久久99国产精品视频| 成人免费无遮挡| 国产一区二区三区四区五区在线| 日韩精品乱码av一区二区| 黄色成人在线免费| 免费成人美女在线观看| 国产精品酒店视频| 久久久久久久久久av| 久久精品免视着国产成人| 天天操人人干| www.麻豆| 亚洲视频大全| 欧美精品亚洲二区| 91热爆在线观看| 免费看的黄色大片| 成人激情视频在线观看| 三级三级久久三级久久18| 91国偷自产一区二区使用方法| 日韩国产欧美一区二区| 亚洲欧美在线人成swag| 欧美第一黄色网| 欧美日韩在线视频一区二区| av在线网站观看| 久久99久久精品| 鲁一鲁一鲁一鲁一av| 精品国产乱码久久久久久蜜臀网站| 日本色图欧美色图| 日韩激情av在线播放| 99久久免费精品国产72精品九九| 国产日韩精品一区| 国产毛片久久久久久| 538国产精品视频一区二区| 国产一区二区不卡老阿姨| 久久综合色天天久久综合图片| 亚洲欧美在线观看视频| 91麻豆精品国产无毒不卡在线观看| 国产又大又黄又猛| 日韩av三级在线| 欧美一级视频免费在线观看| 四虎国产精品永久| 免费人成网站在线观看欧美高清| 天天操天天射天天插| 黑人狂躁日本妞一区二区三区| 成人9ⅰ免费影视网站| 亚洲男同1069视频| 亚洲伊人网在线观看| 欧美一级黄色录像片| 久久影视一区二区| 成人满18在线观看网站免费| 黄色亚洲大片免费在线观看| 国产精品久久久久野外| 亚洲精品www.| 国产精品久久二区二区| 91www在线| 欧美日韩精品一区二区三区视频播放| 亚洲一区在线电影| 色婷婷**av毛片一区| 亚洲视频在线观看免费视频| 欧美影院一区| 欧美久久久久久一卡四| 亚洲免费人成在线视频观看| 亚洲精品一区二区三区av| 五月婷婷丁香综合网| 最近2019免费中文字幕视频三| 日本少妇精品亚洲第一区| 美女脱光内衣内裤视频久久影院| 日韩亚洲精品在线| 日本精品免费| 成人欧美一区二区三区在线观看| 午夜精品福利影院| 嗯用力啊快一点好舒服小柔久久| 宅男在线精品国产免费观看| 国产丝袜在线视频| 久久婷婷一区二区三区| 国产一区二区三区av在线| 亚洲第一中文字幕在线观看| 日日噜噜噜噜久久久精品毛片| 99热精品在线播放| 日韩在线你懂得| 给我看免费高清在线观看| 97在线精品国自产拍中文| 中文字幕国产日韩| 美女日韩在线中文字幕| 成人免费毛片片v| 午夜在线小视频| 国产精品麻豆免费版现看视频| 高清av免费一区中文字幕| 亚洲美女爱爱视频| 国产日本欧美一区二区三区| 国产a亚洲精品| 在线免费观看麻豆| 亚洲精品日韩在线观看| 大片免费在线观看| 亚洲精品一区中文| 色88888久久久久久影院按摩| 国产91精品黑色丝袜高跟鞋| 黄色福利视频网站| 东京热一区二区三区四区| 色先锋aa成人| 日本午夜一区二区三区| 亚洲美女av在线| 欧美日韩亚洲一区二区三区四区| 91九色精品国产一区二区| 精品久久久久久久久久岛国gif| www.亚洲免费视频| 免费av网站在线看| 国产午夜精品理论片在线| 在线观看日本中文字幕| 久久久久电影| 国产一区二区美女视频| 一级在线视频| 91看片在线播放| 蜜桃视频在线观看www| 精品视频在线观看日韩| 肉体视频在线| 免费在线观看污网站| 亚洲六月丁香色婷婷综合久久| eeuss影院www在线观看| 在线观看日本中文字幕| 欧美老头gaygay1069| 中文在线字幕免费观| www.中文字幕.com| 国产精品亚发布| 欧美黑人猛交| 久久99国产精品久久99| 久久免费看毛片| 国产一区精品在线| www.成年人视频| 久久国产视频一区|