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

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

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開發資料庫,
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
午夜精品视频在线| 欧美日韩国产成人在线| 精品女同一区二区三区在线播放| 精品国内亚洲在观看18黄| 欧美电影免费看| 国产国语videosex另类| 国产精品久久久久999| 国产精品看片资源| 91热福利电影| 91久久精品一区| 国产91成人在在线播放| 欧美一区三区三区高中清蜜桃| 国产精品日日摸夜夜添夜夜av| 国产视频福利一区| 欧美日韩国产精品一区| 91亚洲va在线va天堂va国| 亚洲第一精品夜夜躁人人爽| 久久久久日韩精品久久久男男| 国产综合在线观看视频| 国产在线一区二区三区| 久久好看免费视频| 久久91精品国产| 欧美激情国内偷拍| 国产97人人超碰caoprom| 亚洲第一色中文字幕| 欧美成年人视频网站欧美| 91九色综合久久| 欧美黑人视频一区| 91夜夜未满十八勿入爽爽影院| 亚洲欧美日韩成人| 亚洲男人的天堂网站| 亚洲国产成人精品一区二区| 欧美片一区二区三区| 亚洲精选在线观看| 久热爱精品视频线路一| 国产精品视频色| 精品久久久久久久久久久久久| 97视频免费观看| 亚洲精品美女在线观看| 一区二区三区久久精品| 亚洲人成在线免费观看| 久久天天躁狠狠躁夜夜爽蜜月| 国产精品一区二区三区免费视频| 国产日韩专区在线| 国产日本欧美一区| 亚洲图片欧美日产| 国产日韩av高清| 亚洲国产另类久久精品| 国产精品免费一区二区三区都可以| 精品久久久999| 国产精品永久在线| 亚洲九九九在线观看| 午夜精品久久久久久久99热浪潮| 久久免费视频在线观看| 91在线视频精品| 不卡在线观看电视剧完整版| 亚洲国产成人一区| 欧美激情在线观看| 国产一区欧美二区三区| 久久久视频免费观看| 久久久精品网站| 国产精品视频一区二区高潮| www高清在线视频日韩欧美| 久久人人看视频| 在线激情影院一区| 国产精品免费视频久久久| 日韩在线视频观看| 亚洲欧美日韩精品久久亚洲区| 日韩美女福利视频| 欧美电影免费观看| 国产精品日韩久久久久| 亚洲综合中文字幕68页| 成人精品在线视频| 97精品国产97久久久久久春色| 久久精品中文字幕一区| 国产精品99久久久久久白浆小说| 欧美精品一本久久男人的天堂| 97精品一区二区视频在线观看| 亚洲美女精品久久| 欧美日韩激情视频| 久久久精品亚洲| 欧美视频中文字幕在线| www.欧美免费| 国产精品自产拍在线观看中文| 久久久久久久久久久av| 欧美久久精品午夜青青大伊人| 欧美猛男性生活免费| 精品国产欧美成人夜夜嗨| 色悠久久久久综合先锋影音下载| 亚洲国内精品在线| 久久精品国产亚洲7777| 欧美一区二三区| 欧美午夜丰满在线18影院| 青草热久免费精品视频| 精品av在线播放| 欧美精品性视频| 久久免费精品日本久久中文字幕| 性色av一区二区三区免费| 日韩欧美中文字幕在线观看| 精品女同一区二区三区在线播放| www亚洲欧美| 亚洲香蕉成人av网站在线观看| 欧美激情亚洲国产| 一级做a爰片久久毛片美女图片| 国产91精品视频在线观看| 国产精品免费观看在线| 亚洲国产精久久久久久久| 欧美激情视频在线免费观看 欧美视频免费一| 久久久精品久久久| 91国偷自产一区二区三区的观看方式| 亚洲第一福利视频| 日本欧美中文字幕| 日本精品一区二区三区在线播放视频| 欧美日韩国产二区| 青青草国产精品一区二区| 国产精品入口免费视频一| 欧美高清电影在线看| 久久精品国产2020观看福利| 57pao精品| 欧美天堂在线观看| 欧美色另类天堂2015| 亚洲第一男人天堂| 欧美激情奇米色| 国产精品久久久久久久av电影| 精品高清美女精品国产区| 97热精品视频官网| 亚洲精品日韩久久久| 国产视频欧美视频| 国产欧美亚洲视频| 亚洲成在人线av| 91久久国产综合久久91精品网站| 7777精品久久久久久| 91精品免费看| 中文字幕在线成人| 国产欧洲精品视频| 91精品国产成人www| 国产精品jvid在线观看蜜臀| 国产一区二区精品丝袜| 日本午夜精品理论片a级appf发布| 日韩亚洲精品电影| 日韩小视频在线| 久久久国产成人精品| 久久人91精品久久久久久不卡| 国产精品久久久91| 国产a∨精品一区二区三区不卡| 日韩精品亚洲精品| 亚洲人成绝费网站色www| 九九九热精品免费视频观看网站| 精品久久久一区二区| 成人激情黄色网| 国内精品久久久久影院优| 成人黄色中文字幕| 国产精品日韩欧美综合| 国产亚洲激情在线| 伊人成人开心激情综合网| 久久免费成人精品视频| 久久久久久12| 色婷婷综合久久久久| 国产精品视频免费在线观看| 欧美大片免费观看| 精品视频在线观看日韩| 亚洲sss综合天堂久久| 国精产品一区一区三区有限在线| 九九九久久国产免费|