国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院

首頁 > 學院 > 邏輯算法 > 正文

php:樹形結構的算法 2

2024-09-08 23:18:45
字體:
來源:轉載
供稿:網友
  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
  
  這樣整個樹狀結構可以通過左右值來存儲到數據庫中。繼續之前,我們看一看下面整理過的數據表。
  
  
  +-----------------------+-----+-----+
  | 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"來表示左右字段。 另外這種結構中不再需要"parent"字段來表示樹狀結構。也就是 說下面這樣的表結構就足夠了。
  
  +------------+-----+-----+
  | 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 |
  +------------+-----+-----+
  好了我們現在可以從數據庫中獲取數據了,例如我們需要得到"fruit"項下的所有所有節點就可以這樣寫查詢語句: select * from tree where lft between 2 and 11; 這個查詢得到了以下的結果。
  
  
  +------------+-----+-----+
  | name | lft | rgt |
  +------------+-----+-----+
  | fruit | 2 | 11 |
  | red | 3 | 6 |
  | cherry | 4 | 5 |
  | yellow | 7 | 10 |
  | banana | 8 | 9 |
  +------------+-----+-----+
  看到了吧,只要一個查詢就可以得到所有這些節點。為了能夠像上面的遞歸函數那樣顯示整個樹狀結構,我們還需要對這樣的查詢進行排序。用節點的左值進行排序:
  
  select * from tree where lft between 2 and 11 order by lft asc;
  剩下的問題如何顯示層級的縮進了。
  
  <?php
  function display_tree($root)
  {
  // 得到根節點的左右值
  $result = mysql_query('select lft, rgt from tree '.'where name="'.$root.'";');
  $row = mysql_fetch_array($result);
  
  // 準備一個空的右值堆棧
  $right = array();
  
  // 獲得根基點的所有子孫節點
  $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)
  {
  // 檢查我們是否應該將節點移出堆棧
  while ($right[count($right)-1]<$row['rgt'])
  {
  array_pop($right);
  }
  }
  
  // 縮進顯示節點的名稱
  echo str_repeat(' ',count($right)).$row['name']."n";
  
  // 將這個節點加入到堆棧中
  $right[] = $row['rgt'];
  }
  }
  ?>
  如果你運行一下以上的函數就會得到和遞歸函數一樣的結果。只是我們的這個新的函數可能會更快一些,因為只有2次數據庫查詢。 要獲知一個節點的路徑就更簡單了,如果我們想知道cherry 的路徑就利用它的左右值4和5來做一個查詢。
  
  select name from tree where lft < 4 and rgt > 5 order by lft asc;
  這樣就會得到以下的結果:
  
  +------------+
  | name |
  +------------+
  | food |
  | fruit |
  | red |
  +------------+
  那么某個節點到底有多少子孫節點呢?很簡單,子孫總數=(右值-左值-1)/2 descendants = (right – left - 1) / 2 不相信?自己算一算啦。用這個簡單的公式,我們可以很快的算出"fruit 2-11"節點有4個子孫節點,而"banana 8-9"節點沒有子孫節點,也就是說它不是一個父節點了。
  很神奇吧?雖然我已經多次用過這個方法,但是每次這樣做的時候還是感到很神奇。
  
  這的確是個很好的辦法,但是有什么辦法能夠幫我們建立這樣有左右值的數據表呢?這里再介紹一個函數給大家,這個函數可以將name和parent結構的表自動轉換成帶有左右值的數據表。
  
  
  <?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;
  }
  ?>
  當然這個函數是一個遞歸函數,我們需要從根節點開始運行這個函數來重建一個帶有左右值的樹
  
  rebuild_tree('food',1);
  這個函數看上去有些復雜,但是它的作用和手工對表進行編號一樣,就是將立體多層結構的轉換成一個帶有左右值的數據表。

注冊會員,創建你的web開發資料庫,
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院
人人澡人人爽| 亚洲激情丁香| 国产成人午夜电影| 国产精品9区| 一级二级三级在线观看| www.国产精| 免费电影网站在线视频观看福利| 欧美性受xxxx免费视频| 国产麻豆麻豆| 国产高清一级片| 久草视频国产| 国产porn在线| 国产在线www| 中文字幕乱在线伦视频乱在线伦视频| 尤物视频在线免费观看| 99热国产在线| 影音先锋在线中文字幕| 91极品在线| av亚洲在线| 俺来俺也去www色在线观看| 国产精彩视频在线观看免费蜜芽| 免费精品国产自产拍在| 国产午夜在线观看| www.香蕉视频在线观看| 国产精品白浆流出视频| 四虎一区二区三区| 国产高清在线视频| 最新黄网在线观看| 九九热视频免费观看| 精品极品三级久久久久| 日本中文字幕在线观看| 免费在线播放av| 中文字幕4区| 国产98在线| 国产小视频在线播放| 久热中文字幕精品视频在线| 国产黄色片中文字幕| 国产在线黄色片| h网址在线观看| av片在线观看永久免费| 青青草免费在线观看| 国产你懂的在线观看| 中文字幕av免费| 91av福利| 97中文字幕| 在线国产一区二区三区| 91亚洲天堂| 精品视频一二区| 国产大学生粉嫩无套流白浆| 最近中文字幕av免费高清 | 国产黄色av免费看| 国产一级黄色片免费| 国产精品㊣新片速递bt| 欧美日韩视频精品二区| 阿v免费在线观看| 开心婷婷激情| 天堂资源最新版在线视频观看免费网| 日本在线天堂| 超碰在线97国产| 国产美女视频一区二区三区 | 91精品专区| av福利在线播放| 日韩精品免费一区二区| a视频在线播放| 国产美女被草| 国产激情在线视频| 亚洲精品自拍区在线观看| 夜夜爽夜夜操| 丁香视频五月| 国产高清免费av在线| 日本三级在线视频| 天天av综合网| 在线观看免费视频一区二区三区| www.av在线| 国产黄色av免费看| 欧美性xxxx交| 国产区成人精品视频| av在线官网| 国产日产一区二区三区| 欧美精品se| 精品一区二区三区在线观看l| 青青久草在线| 精品国内自产拍在线视频| 国产农村av| 白浆爆出在线观看| 国产91在线视频蝌蚪| 丁香综合五月| 欧美精品se| www网站在线观看| av超碰在线| 伊人伊人av电影| 国产女人在线视频| 久久精品无码一区二区日韩av| 99在线视频观看| 91视频久色| 国产91在线视频蝌蚪| 国产一二三视频| 日本中文字幕在线看| 国产69精品久久久久孕妇国产69久久| 小说区乱图片区| 天天操中文字幕视频| 在线三级av| 在线视频中文字幕第一页| 国产精品视频一区二区免费不卡 | www.夜夜操.com| 热99re久久精品精品免费| 在线观看电影av| 天堂√中文在线| 午夜亚洲成人| 欧美日韩视频精品二区| 青青草原国产在线观看| 黄色片大全在线观看| 国产在线观看网站| 国产一级又黄| 国产youjizz在线| 国产黄色在线播放| 99在线播放| 免费日本黄色| 中文字幕在线视频观看| 国产精品入口免费麻豆| 99在线免费观看| 狠狠操天天操夜夜操| 国产精品美女视频免费观看软件 | 国产三级视频在线看| 国产成人精品综合网站| 亚洲天堂影院在线观看| 久久99精品久久久久久野外| 中文字幕在线影院| 在线免费看黄| 午夜av在线免费观看| 91黄色在线| 超碰免费在线播放| 69视频在线| 国产美女被草| 亚洲日本一区二区三区在线观看| 黄色电影网站在线观看| 在线国产中文字幕| 国产香蕉视频在线观看| 欧美色第一页| 伊人中文在线| 国产精品视频一区二区免费不卡 | 亚洲欧洲成人| 国产精品白浆流出视频| 二区中文字幕| 四虎国产精品永久| 国产三级在线免费| 五月婷婷导航| 国产精品一二三区视频| www.色婷婷| 一本大道久久精品| 精品久久亚洲一级α| 国产精品午夜久久久久久| jlzzjlzz欧美| 天堂在线国产| 青青草观看免费视频在线| 亚洲欧美精品中文第三| 91中文字幕| 一区二区免费播放| 亚洲综合色视频在线观看| 精品福利影院| 777电影在线观看| 国产91足控脚交在线观看| 国产精品ⅴa有声小说| 国产精品被窝福利一区| 国产精彩视频在线观看免费蜜芽| 国产秀色在线www免费观看| 国产一级在线观看| 国产精品入口麻豆电影| 国产成人夜间影院在线观看| 91午夜在线| xxxxx中文字幕| 麻豆精品免费视频入口| 青青青青在线| 国产中文字幕网| 99热在线免费观看| 99热最新网址| 精品国语对白精品自拍视| 亚洲成人福利| 国产精选在线视频拍拍拍| 最新超碰在线| av网址在线看| 国产在线视频精品视频免费看| 激情在线视频播放| 国产视频2区| www.九九热.com| **三级三级97片毛片| 国产天堂在线播放视频| 在线观看的网站你懂的| 国产麻豆高清视频在线第一页| 国产精品欧美韩国日本久久| 精品一区二区三区在线成人| 日本h片在线观看| 国产深夜视频在线观看| www.狠狠| 精品日韩av| 中文字幕在线影视资源| 日本在线视频www鲁啊鲁| 国产精品理人伦一区二区三区| 轻轻色免费在线视频| 99在线免费视频|