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

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

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

2024-09-08 23:18:45
字體:
供稿:網(wǎng)友
菜鳥學(xué)堂:

       從喜悅村上轉(zhuǎn)載,以前也讀過此文,講述得還是比較清楚的。

  產(chǎn)品分類,多級的樹狀結(jié)構(gòu)的論壇,郵件列表等許多地方我們都會遇到這樣的問題:如何存儲多級結(jié)構(gòu)的數(shù)據(jù)?
  
  在php的應(yīng)用中,提供后臺數(shù)據(jù)存儲的通常是關(guān)系型數(shù)據(jù)庫,它能夠保存大量的數(shù)據(jù),提供高效的數(shù)據(jù)檢索和更新服務(wù)。然而關(guān)系型數(shù)據(jù)的基本形式是縱橫交錯的表,是一個平面的結(jié)構(gòu),如果要將多級樹狀結(jié)構(gòu)存儲在關(guān)系型數(shù)據(jù)庫里就需要進(jìn)行合理的翻譯工作。接下來我會將自己的所見所聞和一些實(shí)用的經(jīng)驗(yàn)和大家探討一下。
  
  層級結(jié)構(gòu)的數(shù)據(jù)保存在平面的數(shù)據(jù)庫中基本上有兩種常用設(shè)計方法:
  
  毗鄰目錄模式(adjacency list model)
  預(yù)排序遍歷樹算法(modified preorder tree traversal algorithm)
  我不是計算機(jī)專業(yè)的,也沒有學(xué)過什么數(shù)據(jù)結(jié)構(gòu)的東西,所以這兩個名字都是我自己按照字面的意思翻的,如果說錯了還請多多指教。
  
  這兩個東西聽著好像很嚇人,其實(shí)非常容易理解。這里我用一個簡單食品目錄作為我們的示例數(shù)據(jù)。 我們的數(shù)據(jù)結(jié)構(gòu)是這樣的:
  
  
  food
  |
  |---fruit
  | |
  | |---red
  | | |
  | | |--cherry
  | |
  | |---yellow
  | |
  | |--banana
  |
  |---meat
  |
  |--beef
  |
  |--pork
  為了照顧那些英文一塌糊涂的php愛好者
  
  food:食物
  fruit:水果
  red:紅色
  cherry:櫻桃
  yellow:黃色
  banana:香蕉
  meat:肉類
  beef:牛肉
  pork:豬肉
  
  毗鄰目錄模式(adjacency list model)
  
  這種模式我們經(jīng)常用到,很多的教程和書中也介紹過。我們通過給每個節(jié)點(diǎn)增加一個屬性 parent 來表示這個節(jié)點(diǎn)的父節(jié)點(diǎn)從而將整個樹狀結(jié)構(gòu)通過平面的表描述出來。根據(jù)這個原則,例子中的數(shù)據(jù)可以轉(zhuǎn)化成如下的表:
  
  +-----------------------+
  | parent | name |
  +-----------------------+
  | | food |
  | food | fruit |
  | fruit | green |
  | green | pear |
  | fruit | red |
  | red | cherry |
  | fruit | yellow |
  | yellow | banana |
  | food | meat |
  | meat | beef |
  | meat | pork |
  +-----------------------+
  我們看到 pear 是green的一個子節(jié)點(diǎn),green是fruit的一個子節(jié)點(diǎn)。而根節(jié)點(diǎn)'food'沒有父節(jié)點(diǎn)。 為了簡單地描述這個問題, 這個例子中只用了name來表示一個記錄。 在實(shí)際的數(shù)據(jù)庫中,你需要用數(shù)字的id來標(biāo)示每個節(jié)點(diǎn),數(shù)據(jù)庫的表結(jié)構(gòu)大概應(yīng)該像這樣:id, parent_id, name, description。有了這樣的表我們就可以通過數(shù)據(jù)庫保存整個多級樹狀結(jié)構(gòu)了。
  
  顯示多級樹
  如果我們需要顯示這樣的一個多級結(jié)構(gòu)需要一個遞歸函數(shù)。
  
  <?php
  // $parent is the parent of the children we want to see
  // $level is increased when we go deeper into the tree,
  // used to display a nice indented tree
  
  function display_children($parent, $level)
  {
  // 獲得一個 父節(jié)點(diǎn) $parent 的所有子節(jié)點(diǎn)
  $result = mysql_query('select name from tree '.
  'where parent="'.$parent.'";');
  
  // 顯示每個子節(jié)點(diǎn)
  while ($row = mysql_fetch_array($result))
  {
  // 縮進(jìn)顯示節(jié)點(diǎn)名稱
  echo str_repeat(' ',$level).$row['name']."n";
  
  //再次調(diào)用這個函數(shù)顯示子節(jié)點(diǎn)的子節(jié)點(diǎn)
  
  display_children($row['name'], $level+1);
  }
  }
  ?>
  對整個結(jié)構(gòu)的根節(jié)點(diǎn)(food)使用這個函數(shù)就可以打印出整個多級樹結(jié)構(gòu),由于food是根節(jié)點(diǎn)它的父節(jié)點(diǎn)是空的,所以這樣調(diào)用: display_children('',0)。將顯示整個樹的內(nèi)容:
  
  
  food
  fruit
  red
  cherry
  yellow
  banana
  meat
  beef
  pork
  如果你只想顯示整個結(jié)構(gòu)中的一部分,比如說水果部分,就可以這樣調(diào)用:
  
  display_children('fruit',0);
  
  幾乎使用同樣的方法我們可以知道從根節(jié)點(diǎn)到任意節(jié)點(diǎn)的路徑。比如 cherry 的路徑是 "food > fruit > red"。 為了得到這樣的一個路徑我們需要從最深的一級"cherry"開始, 查詢得到它的父節(jié)點(diǎn)"red"把它添加到路徑中, 然后我們再查詢red的父節(jié)點(diǎn)并把它也添加到路徑中,以此類推直到最高層的"food"
  
  <?php
  // $node 是那個最深的節(jié)點(diǎn)
  function get_path($node)
  {
  // 查詢這個節(jié)點(diǎn)的父節(jié)點(diǎn)
  $result = mysql_query('select parent from tree '.
  'where name="'.$node.'";');
  $row = mysql_fetch_array($result);
  
  // 用一個數(shù)組保存路徑
  $path = array();
  
  // 如果不是根節(jié)點(diǎn)則繼續(xù)向上查詢
  // (根節(jié)點(diǎn)沒有父節(jié)點(diǎn))
  if ($row['parent']!='')
  {
  // the last part of the path to $node, is the name
  // of the parent of $node
  $path[] = $row['parent'];
  
  // we should add the path to the parent of this node
  // to the path
  $path = array_merge(get_path($row['parent']), $path);
  }
  
  // return the path
  return $path;
  }
  ?>
  如果對"cherry"使用這個函數(shù):print_r(get_path('cherry')),就會得到這樣的一個數(shù)組了:
  
  
  array
  (
  [0] => food
  [1] => fruit
  [2] => red
  )
  接下來如何把它打印成你希望的格式,就是你的事情了。
  缺點(diǎn):這種方法很簡單,容易理解,好上手。但是也有一些缺點(diǎn)。主要是因?yàn)檫\(yùn)行速度很慢,由于得到每個節(jié)點(diǎn)都需要進(jìn)行數(shù)據(jù)庫查詢,數(shù)據(jù)量大的時候要進(jìn)行很多查詢才能完成一個樹。另外由于要進(jìn)行遞歸運(yùn)算,遞歸的每一級都需要占用一些內(nèi)存所以在空間利用上效率也比較低。
  
  現(xiàn)在讓我們看一看另外一種不使用遞歸計算,更加快速的方法,這就是預(yù)排序遍歷樹算法(modified preorder tree traversal algorithm) 這種方法大家可能接觸的比較少,初次使用也不像上面的方法容易理解,但是由于這種方法不使用遞歸查詢算法,有更高的查詢效率。
  
  我們首先將多級數(shù)據(jù)按照下面的方式畫在紙上,在根節(jié)點(diǎn)food的左側(cè)寫上 1 然后沿著這個樹繼續(xù)向下 在 fruit 的左側(cè)寫上 2 然后繼續(xù)前進(jìn),沿著整個樹的邊緣給每一個節(jié)點(diǎn)都標(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é)點(diǎn)之間的關(guān)系,"red"的號是3和6,它是 "food" 1-18 的子孫節(jié)點(diǎn)。 同樣,我們可以看到 所有左值大于2和右值小于11的節(jié)點(diǎn) 都是"fruit" 2-11 的子孫節(jié)點(diǎn)

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
欧美日韩在线播| 在线观看中文字幕码| 欧美视频在线观看| 爽爽淫人综合网网站| 国产精品热视频| 亚洲欧洲精品在线观看| 夜先锋资源网| 视频一区中文字幕国产| 欧美性猛交xxxx免费看久久久| 99视频资源网| 久久66热这里只有精品| 女人公敌韩国| 欧美中文字幕在线观看视频| 黄色国产在线播放| 亚洲欧洲专区| 日韩欧美视频网站| 日韩免费观看视频| 欧美肉体xxxx裸体137大胆| 亚洲欧美日韩国产手机在线| 97在线中文字幕| 久久久精品免费视频| 亚洲av毛片成人精品| 亚洲一区二区精品久久av| 亚洲精品mv在线观看| 久一视频在线观看| 欧美人与性动交xxⅹxx| 国产一区网站| 9人人澡人人爽人人精品| 国产精品偷伦视频免费观看了| 91青青草免费在线看| 国产成人精品一区二区三区在线观看| 国产亚洲一区二区三区在线播放| 九九九热精品免费视频观看网站| 亚洲日本欧美日韩高观看| 9a蜜桃久久久久久免费| 日本黄色动态图| 欧美性猛交 xxxx| 美女亚洲精品| √8天堂资源地址中文在线| 国产欧美日韩激情| 天天干 夜夜操| 欧美久久成人| 久久精品人人爽| www.av免费| 日韩成人av在线播放| 国产一区二区精品在线观看| 欧美日韩在线播放三区| 亚洲欧美在线磁力| 黄色片免费在线观看| 日韩人妻精品中文字幕| 免费看涩涩视频| 黑人玩欧美人三根一起进| 欧美在线不卡一区| 成人精品免费在线观看| 久久嫩草捆绑紧缚| 亚洲最新在线| 国产极品美女到高潮| 亚洲精品国产福利| 中国一区二区三区| 在线免费观看色| 国产xxxx做受性欧美88| 久久免费福利| 九九九九九精品| 韩国成人免费视频| 女~淫辱の触手3d动漫| 成人18夜夜网深夜福利网| 中文字幕一区二区三区人妻四季| 狼狼综合久久久久综合网| 亚洲精品欧美在线| 性刺激综合网| 国产一二三区精品| 日本网址在线观看| 国产视频一二三四区| 147欧美人体大胆444| 欧美一区二区三区精品电影| 久99久在线视频| 亚洲加勒比久久88色综合| 国产美女亚洲精品7777| 亚洲一区二区欧美激情| 中文在线√天堂| 精品无码免费视频| 成人在线免费观看一区| 青青在线视频免费| 欧美人与物videos另类xxxxx| 欧美在线视频第一页| 欧美性猛交xxxx偷拍洗澡| 欧美激情一二三区| 91精品国产高清久久久久久| 亚洲国产高清高潮精品美女| 黄色片子在线观看| 久久久久久综合网天天| 牛牛精品成人免费视频| 香蕉久久精品日日躁夜夜躁| 天天av天天翘| 日韩一级片免费| 超碰成人福利网| 亚洲第一中文av| 日韩av一级| 国产精品久久电影观看| 亚洲少妇中文在线| 91丝袜高跟美女视频| 9999在线观看| www.国产区| 操女生的网站| 北岛玲日韩精品一区二区三区| 中文字幕免费精品一区高清| 黄色免费成人| 日本中文字幕免费观看| 欧美精品小视频| 91精品麻豆| 国产又粗又猛大又黄又爽| 午夜一级毛片| 亚州色图欧美色图| 男女羞羞在线观看| jizz老师| 久久er99热精品一区二区| 国产毛片视频| 黄视频在线观看免费| 欧美少妇激情| 国产精品无码免费专区午夜| 91黑丝在线| 日本中文字幕久久| 色婷婷综合久色| 蜜臀久久99精品久久一区二区| 亚洲精品第一国产综合精品| 成人嘿咻视频免费看| 日韩精品电影在线观看| 青青操视频在线观看| 亚洲一区二区av| 亚洲精品久久久久久无码色欲四季| 欧美一区二区三区婷婷| 激情亚洲一区二区三区四区| 香港久久久电影| 亚洲高清视频网站| 黄网站色视频免费观看| 色综合色综合色综合色综合| 欧美精品久久天天躁| 青青草原综合久久大伊人精品| 精品久久久国产精品999| 亚洲国产精品一区在线观看不卡| 久久精品视频免费观看| 成人污污www网站免费丝瓜| 99精品在免费线偷拍| 欧美日韩精品在线一区二区| 最新天堂中文在线| 一本大道香蕉8中文在线视频| 日韩偷拍自拍| 曰批又黄又爽免费视频| 欧美成人久久久免费播放| 亚洲444eee在线观看| 国产激情无套内精对白视频| 中国一级特黄毛片大片| 精品午夜福利视频| 国产精品自偷自拍| 亚洲精品毛片一区二区三区| 91精品免费观看| 在线视频观看日韩| 亚洲第一免费看片| 日韩三级在线观看| 中文久久电影小说| 欧美手机视频| 日韩在线中文字幕视频| 中文字幕日韩av综合精品| 飘雪影视在线观看免费观看| 久久久精品午夜少妇| 国产无人区码熟妇毛片多| 在线亚洲美日韩| 成人3d精品动漫精品一二三| 在线亚洲国产精品网站| 综合图区亚洲| 最近更新在线中文字幕一页| 日韩视频在线一区二区| www.亚洲一区二区三区| 99riav国产精品视频| 国产亚洲第一的欧洲日产| 青青草原一区二区| 黑人精品xxx一区| 日韩美女黄色片| 亚洲一区二区三| 中文字幕精品在线播放| 亚州欧美日韩中文视频| 国产大奶视频| 免费人成在线观看网站| 欧美精品乱码视频一二专区| 在线免费黄色小视频| 美女露出粉嫩尿囗让男人桶| 澳门久久精品| 欧美日韩91| 四虎永久在线观看| 蜜桃av噜噜一区二区三区麻豆| 中文字幕一区二区三区中文字幕| 亚洲欧美清纯在线制服| 亚洲国产电影在线观看| 亚洲一级爰片777777| 亚洲综合小说| 日本福利视频在线观看| 亚洲爆乳无码一区二区三区| 日韩人妻无码一区二区三区| 玛丽玛丽电影原版免费观看1977| av一区二区三区黑人| 国内外成人激情免费视频| 日日狠狠久久| 亚洲国产视频一区二区| 国产伦精品一区二区三毛| 国产日产精品久久久久久婷婷| 在线观看亚洲区| 国产亚洲欧美在线| 天天干天天舔天天射| 国产精品视频免费看| 亚洲久久一区二区| 一区二区三区日韩欧美精品| 亚洲女优在线观看| avtt综合网| 男人的天堂官网| 岛国精品一区二区| 免费观看在线一区二区三区| 国产又粗又大又长| 色综合手机在线| 中文字幕在线免费观看| 黄a在线观看| 久久久男人天堂| 成人av番号网| 成人一区在线观看| 毛片精品免费在线观看| 免费在线毛片网站| 一区二区视频国产| 深夜福利视频在线免费观看| 麻豆md0077饥渴少妇| 91久久在线观看| 欧美精品一区二区在线观看| 先锋影音av中文字幕| 日本1区2区| 日日夜夜亚洲精品| 亚洲aⅴ天堂av在线电影软件| 久久av色综合| 亚洲第一av色| 亚洲成人精品一区二区三区| 中文av资源在线| 欧美疯狂做受xxxx高潮| 五月婷婷视频在线观看| 青青草视频在线视频| 美腿丝袜亚洲色图| 国产www免费观看| 成人羞羞动漫| 久久久视频在线| 亚洲欧美国产一区二区| 国产精品video| 亚洲一区二区三区在线| 免费观看30秒视频久久| 中文字幕天堂在线| 高清欧美性猛交xxxx| 美国黄色a级片| 中文字幕亚洲不卡| av福利在线| 97在线资源在| 国产女人水真多18毛片18精品| 午夜免费福利影院| 亚洲午夜国产成人| 欧美伊人久久| 中文字幕一区免费| 欧美乱大交xxxxx免费| 2021国产精品久久精品| 国产福利在线看| 伊人色综合久久久| 国产三区在线播放| 亚洲美女电影在线| 精品一区在线播放| 久久久影院官网| 黄色影院一级片| 国产精品12区| 国产精品秘入口18禁麻豆免会员| 亚洲久久久久久| 日本亚洲视频在线| 在线免费观看高清视频| 国产激情小视频在线| 黄色一级视频播放| 亚洲精品男同| 国产精品嫩草影院在线看| 最新av在线播放| 亚洲黄色片视频| 久久久久亚洲av片无码| 精品国产鲁一鲁一区二区三区| 肉体视频在线| 人人澡人一摸人人添| 欧美在线一二三区| 国产成人一二片| 一级视频在线观看| 国产精选在线观看| 国产农村妇女毛片精品久久| 大荫蒂欧美视频另类xxxx| 日本高清视频精品| 国产aⅴ超薄肉色丝袜交足| 免费观看在线综合| 日韩欧美一级二级三级久久久| 久久黄色美女电影| 精品无人区麻豆乱码久久久| 国产精品毛片a∨一区二区三区|国| 欧美国产综合视频| 国产日韩精品一区观看| 亚洲欧美日韩在线| 久久99国内精品| 亚洲影院免费观看| 欧美午夜无遮挡| 久久精品人人做人人综合| 不卡av在线网站| 欧美激情一区二区三区全黄| av片哪里在线观看| 欧洲天堂在线观看| 亚洲色图第一页| 欧美另类极品videosbest视频| 精品国产一区二区亚洲人成毛片| 欧美乱妇一区二区三区不卡视频| 亚洲最大福利网站| 亚洲欧洲偷拍精品| 午夜精品123| 国产精品不卡在线观看| 在线视频三区| 大黑人交xxx极品hd| 国产精品一区二区三区av| 欧美猛烈性xbxbxbxb| 蜜桃av一区二区三区电影| 91精品国产一区二区三区蜜臀| 欧美尿孔扩张虐视频| 写真福利片hd在线播放| 91精品国产高清自在线| 真实国产乱子伦对白在线| 精品一区二区三区电影| 婷婷激情小说网|