日本免费精品_最新日韩一区_亚洲视频一区在线_a在线视频观看_天天射夜夜骑_粉嫩av一区二区三区_欧美中日韩免费视频_综合图区欧美_国内精品美女在线观看_午夜精品久久久久久久男人的天堂

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

解析左右值無限分類的實(shí)現(xiàn)算法

2020-03-22 20:24:25
字體:
供稿:網(wǎng)友
一、引言
產(chǎn)品分類,多級(jí)的樹狀結(jié)構(gòu)的論壇,郵件列表等許多地方我們都會(huì)遇到這樣的問題:如何存儲(chǔ)多級(jí)結(jié)構(gòu)的數(shù)據(jù)?在PHP的應(yīng)用中,提供后臺(tái)數(shù)據(jù)存儲(chǔ)的通常是關(guān)系型數(shù)據(jù)庫,它能夠保存大量的數(shù)據(jù),提供高效的數(shù)據(jù)檢索和更新服務(wù)。然而關(guān)系型數(shù)據(jù)的基本形式是縱橫交錯(cuò)的表,是一個(gè)平面的結(jié)構(gòu),如果要將多級(jí)樹狀結(jié)構(gòu)存儲(chǔ)在關(guān)系型數(shù)據(jù)庫里就需要進(jìn)行合理的翻譯工作。接下來我會(huì)將自己的所見所聞和一些實(shí)用的經(jīng)驗(yàn)和大家探討一下:
層級(jí)結(jié)構(gòu)的數(shù)據(jù)保存在平面的數(shù)據(jù)庫中基本上有兩種常用設(shè)計(jì)方法:
* 毗鄰目錄模式(adjacency list model)
* 預(yù)排序遍歷樹算法(modified preorder tree traversal algorithm)
我不是計(jì)算機(jī)專業(yè)的,也沒有學(xué)過什么數(shù)據(jù)結(jié)構(gòu)的東西,所以這兩個(gè)名字都是我自己按照字面的意思翻的,如果說錯(cuò)了還請(qǐng)多多指教。這兩個(gè)東西聽著好像很嚇人,其實(shí)非常容易理解。二、模型
這里我用一個(gè)簡(jiǎn)單食品目錄作為我們的示例數(shù)據(jù)。
我們的數(shù)據(jù)結(jié)構(gòu)是這樣的,以下是代碼:
復(fù)制代碼 代碼如下:
Food

|---Fruit

| |---Red

| | |--Cherry

| +---Yellow

| +--Banana

+---Meat
|--Beef
+--Pork

為了照顧那些英文一塌糊涂的PHP愛好者
復(fù)制代碼 代碼如下:
Food : 食物
Fruit : 水果
Red : 紅色
Cherry: 櫻桃
Yellow: 黃色
Banana: 香蕉
Meat : 肉類
Beef : 牛肉
Pork : 豬肉

三、實(shí)現(xiàn)
1、毗鄰目錄模式(adjacency list model)
這種模式我們經(jīng)常用到,很多的教程和書中也介紹過。我們通過給每個(gè)節(jié)點(diǎn)增加一個(gè)屬性 parent 來表示這個(gè)節(jié)點(diǎn)的父節(jié)點(diǎn)從而將整個(gè)樹狀結(jié)構(gòu)通過平面的表描述出來。根據(jù)這個(gè)原則,例子中的數(shù)據(jù)可以轉(zhuǎn)化成如下的表:
以下是代碼:
復(fù)制代碼 代碼如下:
+-----------------------+
| 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的一個(gè)子節(jié)點(diǎn),Green是Fruit的一個(gè)子節(jié)點(diǎn)。而根節(jié)點(diǎn)'Food'沒有父節(jié)點(diǎn)。 為了簡(jiǎn)單地描述這個(gè)問題,這個(gè)例子中只用了name來表示一個(gè)記錄。 在實(shí)際的數(shù)據(jù)庫中,你需要用數(shù)字的id來標(biāo)示每個(gè)節(jié)點(diǎn),數(shù)據(jù)庫的表結(jié)構(gòu)大概應(yīng)該像這樣:id, parent_id, name, descrīption。
有了這樣的表我們就可以通過數(shù)據(jù)庫保存整個(gè)多級(jí)樹狀結(jié)構(gòu)了。
顯示多級(jí)樹,如果我們需要顯示這樣的一個(gè)多級(jí)結(jié)構(gòu)需要一個(gè)遞歸函數(shù)。
以下是代碼:
復(fù)制代碼 代碼如下:
?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) {
// 獲得一個(gè) 父節(jié)點(diǎn) $parent 的所有子節(jié)點(diǎn)
$result = mysql_query("
SELECT name
FROM tree
WHERE parent = '" . $parent . "'
;"
);
// 顯示每個(gè)子節(jié)點(diǎn)
while ($row = mysql_fetch_array($result)) {
// 縮進(jìn)顯示節(jié)點(diǎn)名稱
echo str_repeat(' ', $level) . $row['name'] . "/n";
//再次調(diào)用這個(gè)函數(shù)顯示子節(jié)點(diǎn)的子節(jié)點(diǎn)
display_children($row['name'], $level+1);
}
}
?

對(duì)整個(gè)結(jié)構(gòu)的根節(jié)點(diǎn)(Food)使用這個(gè)函數(shù)就可以打印出整個(gè)多級(jí)樹結(jié)構(gòu),由于Food是根節(jié)點(diǎn)它的父節(jié)點(diǎn)是空的,所以這樣調(diào)用: display_children('',0)。將顯示整個(gè)樹的內(nèi)容:
復(fù)制代碼 代碼如下:
Food
Fruit
Red
Cherry
Yellow
Banana
Meat
Beef
Pork

如果你只想顯示整個(gè)結(jié)構(gòu)中的一部分,比如說水果部分,就可以這樣調(diào)用:display_children('Fruit',0);
幾乎使用同樣的方法我們可以知道從根節(jié)點(diǎn)到任意節(jié)點(diǎn)的路徑。比如 Cherry 的路徑是 "Food Fruit Red"。 為了得到這樣的一個(gè)路徑我們需要從最深的一級(jí)"Cherry"開始, 查詢得到它的父節(jié)點(diǎn)"Red"把它添加到路徑中,然后我們?cè)俨樵僐ed的父節(jié)點(diǎn)并把它也添加到路徑中,以此類推直到最高層的"Food",以下是代碼:
復(fù)制代碼 代碼如下:
?php
// $node 是那個(gè)最深的節(jié)點(diǎn)
function get_path($node) {
// 查詢這個(gè)節(jié)點(diǎn)的父節(jié)點(diǎn)
$result = mysql_query("
SELECT parent
FROM tree
WHERE name = '" . $node ."'
;"
);
$row = mysql_fetch_array($result);
// 用一個(gè)數(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;
}
?

如果對(duì)"Cherry"使用這個(gè)函數(shù):print_r(get_path('Cherry')),就會(huì)得到這樣的一個(gè)數(shù)組了:
復(fù)制代碼 代碼如下:
Array (
[0] = Food
[1] = Fruit
[2] = Red
)

接下來如何把它打印成你希望的格式,就是你的事情了。
缺點(diǎn):
這種方法很簡(jiǎn)單,容易理解,好上手。但是也有一些缺點(diǎn)。主要是因?yàn)檫\(yùn)行速度很慢,由于得到每個(gè)節(jié)點(diǎn)都需要進(jìn)行數(shù)據(jù)庫查詢,數(shù)據(jù)量大的時(shí)候要進(jìn)行很多查詢才能完成一個(gè)樹。另外由于要進(jìn)行遞歸運(yùn)算,遞歸的每一級(jí)都需要占用一些內(nèi)存所以在空間利用上效率也比較低。

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

我們首先將多級(jí)數(shù)據(jù)按照下面的方式畫在紙上,在根節(jié)點(diǎn)Food的左側(cè)寫上 1 然后沿著這個(gè)樹繼續(xù)向下 在 Fruit 的左側(cè)寫上 2 然后繼續(xù)前進(jìn),沿著整個(gè)樹的邊緣給每一個(gè)節(jié)點(diǎn)都標(biāo)上左側(cè)和右側(cè)的數(shù)字。最后一個(gè)數(shù)字是標(biāo)在Food 右側(cè)的 18。在下面的這張圖中你可以看到整個(gè)標(biāo)好了數(shù)字的多級(jí)結(jié)構(gòu)。(沒有看懂?用你的手指指著數(shù)字從1數(shù)到18就明白怎么回事了。還不明白,再數(shù)一遍,注意移動(dòng)你的手指)。
這些數(shù)字標(biāo)明了各個(gè)節(jié)點(diǎn)之間的關(guān)系,"Red"的號(hào)是3和6,它是 "Food" 1-18 的子孫節(jié)點(diǎn)。 同樣,我們可以看到 所有左值大于2和右值小于11的節(jié)點(diǎn) 都是"Fruit" 2-11 的子孫節(jié)點(diǎn)
以下是代碼:
復(fù)制代碼 代碼如下:
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ù)表。
以下是代碼:
復(fù)制代碼 代碼如下:
+----------+------------+-----+-----+
| 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)就足夠了。
以下是代碼:
復(fù)制代碼 代碼如下:
+------------+-----+-----+
| 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)就可以這樣寫查詢語句:
復(fù)制代碼 代碼如下:
SELECT * FROM tree WHERE lft BETWEEN 2 AND 11;

這個(gè)查詢得到了以下的結(jié)果。
以下是代碼:
復(fù)制代碼 代碼如下:
+------------+-----+-----+
| 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),我們還需要對(duì)這樣的查詢進(jìn)行排序。用節(jié)點(diǎn)的左值進(jìn)行排序:
復(fù)制代碼 代碼如下:
SELECT * FROM tree WHERE lft BETWEEN 2 AND 11 ORDER BY lft ASC;

剩下的問題如何顯示層級(jí)的縮進(jìn)了。
以下是代碼:
復(fù)制代碼 代碼如下:
?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)的路徑就更簡(jiǎn)單了,如果我們想知道Cherry 的路徑就利用它的左右值4和5來做一個(gè)查詢。
復(fù)制代碼 代碼如下:
SELECT name FROM tree WHERE lft 4 AND rgt 5 ORDER BY lft ASC;

這樣就會(huì)得到以下的結(jié)果:
以下是代碼:
復(fù)制代碼 代碼如下:
+------------+
| name |
+------------+
| Food |
| Fruit |
| Red |
+------------+

那么某個(gè)節(jié)點(diǎn)到底有多少子孫節(jié)點(diǎn)呢?很簡(jiǎn)單,子孫總數(shù)=(右值-左值-1)/2
復(fù)制代碼 代碼如下:
descendants = (right – left - 1) / 2

不相信?自己算一算啦。
用這個(gè)簡(jiǎn)單的公式,我們可以很快的算出"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ù)表。
以下是代碼:
復(fù)制代碼 代碼如下:
?php
function rebuild_tree($parent, $left) {
// the right html' target='_blank'>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è)帶有左右值的樹
復(fù)制代碼 代碼如下:
rebuild_tree('Food',1);

這個(gè)函數(shù)看上去有些復(fù)雜,但是它的作用和手工對(duì)表進(jìn)行編號(hào)一樣,就是將立體多層結(jié)構(gòu)的轉(zhuǎn)換成一個(gè)帶有左右值的數(shù)據(jù)表。
那么對(duì)于這樣的結(jié)構(gòu)我們?cè)撊绾卧黾?,更新和刪除一個(gè)節(jié)點(diǎn)呢?
增加一個(gè)節(jié)點(diǎn)一般有兩種方法:
第一種,保留原有的name 和parent結(jié)構(gòu),用老方法向數(shù)據(jù)中添加數(shù)據(jù),每增加一條數(shù)據(jù)以后使用rebuild_tree函數(shù)對(duì)整個(gè)結(jié)構(gòu)重新進(jìn)行一次編號(hào)。
第二種,效率更高的辦法是改變所有位于新節(jié)點(diǎn)右側(cè)的數(shù)值。舉例來說:我們想增加一種新的水果"Strawberry"(草莓)它將成為"Red"節(jié)點(diǎn)的最后一個(gè)子節(jié)點(diǎn)。首先我們需要為它騰出一些空間。"Red"的右值應(yīng)當(dāng)從6改成8,"Yellow 7-10 "的左右值則應(yīng)當(dāng)改成 9-12。依次類推我們可以得知,如果要給新的值騰出空間需要給所有左右值大于5的節(jié)點(diǎn) (5 是"Red"最后一個(gè)子節(jié)點(diǎn)的右值) 加上2。所以我們這樣進(jìn)行數(shù)據(jù)庫操作:
復(fù)制代碼 代碼如下:
UPDATE tree SET rgt = rgt + 2 WHERE rgt
UPDATE tree SET lft = lft + 2 WHERE lft

這樣就為新插入的值騰出了空間,現(xiàn)在可以在騰出的空間里建立一個(gè)新的數(shù)據(jù)節(jié)點(diǎn)了, 它的左右值分別是6和7
復(fù)制代碼 代碼如下:
INSERT INTO tree SET lft=6, rgt=7, name='Strawberry';

再做一次查詢看看吧!怎么樣?很快吧。四、結(jié)語
好了,現(xiàn)在你可以用兩種不同的方法設(shè)計(jì)你的多級(jí)數(shù)據(jù)庫結(jié)構(gòu)了,采用何種方式完全取決于你個(gè)人的判斷,但是對(duì)于層次多數(shù)量大的結(jié)構(gòu)我更喜歡第二種方法。如果查詢量較小但是需要頻繁添加和更新的數(shù)據(jù),則第一種方法更為簡(jiǎn)便。
另外,如果數(shù)據(jù)庫支持的話 你還可以將rebuild_tree()和 騰出空間的操作寫成數(shù)據(jù)庫端的觸發(fā)器函數(shù), 在插入和更新的時(shí)候自動(dòng)執(zhí)行, 這樣可以得到更好的運(yùn)行效率, 而且你添加新節(jié)點(diǎn)的SQL語句會(huì)變得更加簡(jiǎn)單。
PHP教程

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
中文字幕在线观看播放| 亚洲欧洲三级| 亚洲二区自拍| 国产欧美日韩精品在线观看| 日韩国产一区| 亚洲欧美小说国产图片| 日韩字幕在线观看| 91精品久久久久| 在线亚洲人成| 日本免费在线视频不卡一不卡二| 99中文字幕一区| 亚洲一区视频在线观看视频| 精品国产免费观看一区| 日韩在线高清视频| 日韩一级免费在线观看| 国产伦精品免费视频| 久久久久蜜桃| 国产aa精品| 欧美日韩综合高清一区二区| 欧美日韩在线视频免费观看| 精品999在线| 在线视频不卡国产V| 国产小视频在线观看免费| 日韩欧美成人一区二区三区| 韩国v欧美v日本v亚洲| 日本一级一片免费视频| 欧美日韩精品国产| 最近中文字幕日韩精品| 国产香蕉精品视频| 国产 日韩 欧美 综合 一区| 欧美日韩一级视频| 久久韩国免费视频| 午夜福利一区二区三区| 欧美日韩在线视频免费观看 | 国产不卡一区| 成人xxxx| 亚洲.国产.中文慕字在线| 一级日韩一级欧美| h片精品在线观看| 精品999视频| 免费视频久久| 欧美日韩国产免费| 日韩欧美亚洲国产| 亚洲乱码中文字幕综合| 午夜一区二区视频| 91精品国产日韩91久久久久久| 久久久91精品国产| 国产在线不卡一区| 九七久久人人| 日韩激情一区| 亚洲一区在线视频观看| 国产 欧美 在线| 亚洲欧洲三级| 欧美日韩国产中文| 91xxx在线观看| 一区二区三区高清在线| 日韩欧美中文免费| 国产欧美日韩高清| 中文字幕在线视频久| 亚洲综合在线小说| 高清一区二区| 欧美日韩中文字幕视频| 日韩免费电影网站| 国产免费永久在线观看| 精品一二三四区| 欧美日韩国产一中文字不卡| 午夜av一区| 亚洲黄色一区二区| 91精品久久久久久久91蜜桃| 国产一级视频在线播放| av免费在线播放| 国产高清在线观看| 欧美日韩精品三区| 亚洲免费精品| 中文字幕国产欧美| 天天综合天天做| 日本精品在线| 中文字幕日韩欧美| 国产日韩av高清| 999精品网| 免费日韩精品中文字幕视频在线| 亚洲欧美日本另类| www高清在线视频日韩欧美| 精品国产免费视频| www..com日韩| 丰满少妇一区| 欧美日韩国产免费| 91亚洲国产| 成人a在线观看| www.狠狠| 99精品视频99| 国产中文伊人| 亚洲综合在线中文字幕| 日韩中文欧美在线| 色www精品视频在线观看| a级在线免费观看| 中文字幕日韩精品在线| 成人一区二区不卡免费| 欧美日韩三级一区| 日韩高清不卡一区二区| 亚洲三级中文字幕| 精品久久香蕉国产线看观看gif | 日韩免费电影网站| 国产123在线| 日韩视频中文字幕| 精品中文在线| 日本亚洲欧美| 国产99对白在线播放| 久久久久久99精品| 国产网站av| 第一页在线观看| 久久精品国产91精品亚洲| 国产三级做爰在线观看| 日韩精品首页| 欧美日韩精品在线播放| 日韩中文字幕| 欧美日韩综合视频| 亚洲精品欧美二区三区中文字幕| 亚洲狠狠婷婷综合久久久久图片| 婷婷中文字幕综合| 一区二区视频在线| 午夜伦欧美伦电影理论片| 亚洲福利精品在线| 视频一区中文字幕国产| 日韩午夜一区| 欧美高清一区| 精品网站999| 亚洲影视资源网| 国产日韩精品久久久| 日韩视频不卡中文| 欧美日韩一二三四| 精品视频国产| 欧美三级视频在线| 91精品国产综合久久福利| 高清不卡一区二区| 欧美日韩人人澡狠狠躁视频| 欧美日韩中文在线| 日韩 欧美 亚洲| 91欧美在线| 91精品国产综合久久福利| 亚洲一区导航| 天堂在线中文| 欧美日韩在线不卡一区| 欧美 亚洲 精品 三区| 欧美色欧美亚洲高清在线视频| 日韩专区视频网站| 日韩精品在线视频| 日韩精品手机在线| 中文字幕在线国产| 国产日韩精品视频| 视频一区二区国产| 91精品高清| 日韩午夜黄色| 91精品在线观看入口| 欧美日韩中国免费专区在线看| 午夜精品一区二区三区视频免费看| 欧美日韩中文另类| 欧美日韩国产亚洲一区| 欧美 日韩 国产在线| 天堂在线中文| 日韩精品视频网| 日韩中文字幕亚洲| 国产v日产∨综合v精品视频| 中文字幕无线码一区| 在线欧美日韩精品| 久久99久久久欧美国产| 欧美一级二级三级区| 久久精品99久久久久久久久| 国产不卡的av| 日韩一级二级三级| 中文国产字幕在线观看| 久久蜜桃一区二区| 深夜福利一区| 日韩精品首页| 日韩精品国产欧美| 久久精品电影| 日韩欧美在线不卡| 国产91久久久久蜜臀青青天草二| 久久婷婷中文字幕| 欧美日韩在线不卡| 日本国产一区| 精品播放一区二区| 欧美日韩国产在线看| 高清国产一区| 久久riav| 本道综合精品| 色综合影院在线| 欧美日韩第一区日日骚| 亚洲高清中文字幕| 日韩三级在线播放| 国内不卡的二区三区中文字幕| 国产黄色在线看| 欧美 日韩 国产 高清| 内射国产内射夫妻免费频道| 久草视频观看| 91精品视频观看| 亚洲v中文字幕| 日本精品在线播放| 日本熟女一区二区| 伊人永久在线| 91精品视频免费在线观看| 日韩三级视频中文字幕| 久久精品卡一| 日韩在线播放一区二区| 日韩av一区在线| 欧美久久在线| 精品三级在线| www.三级.com| 欧美日韩国产中文精品字幕自在自线 | 激情婷婷亚洲| 中文字幕精品国产| 精品久久九九| 91精品综合久久久久久| 77777_亚洲午夜久久多人| 中文字幕亚洲一区在线观看| 国产日韩第一页v| 国内不卡的二区三区中文字幕| 精品在线观看一区| 欧美不卡123| 国产性一级片| 精品福利一区二区三区| 国产免费不卡av| 亚洲欧美999| 中文字幕欧美日韩在线| 欧美日韩亚洲一区| 91亚洲欧美| 国产在线观看a| 国产免费久久| 成人xxxx| 99在线国产| 国产拍揄自揄精品视频麻豆| 欧美久久综合性欧美| 国产免费一级片| 精品一区二区在线观看视频| 久久人人88| 免费视频一区三区| 日韩欧美国产成人精品免费| 日韩在线视频中文字幕| 久久综合九色欧美综合狠狠| 日韩美女视频一区二区在线观看| 99精品电影| 亚州福利视频| 国产日韩综合| 国产福利一区二区精品秒拍| 1区不卡电影| 国产免费一级| 国产99亚洲| 中文字幕日韩在线观看| 日韩欧美999| 亚洲精品中文字幕乱码三区| 久久久久久久久99精品| 日韩中文首页| 欧美日韩一级黄| 中文字幕日韩在线视频| 欧美日韩国产综合视频在线观看| 色综合天天性综合| 日韩欧美亚洲国产一区| 欧美二区在线观看| 美女黄a一级视频| 日韩三级视频在线看| 91精品免费观看| 国产激情久久久| 天堂在线www天堂中文在线| 日本亚洲欧美天堂免费| 亚洲欧洲日产国码av系列天堂 | 伊人www22综合色| 91精品在线看V| 一区三区视频| 国产欧美久久久精品影院| 欧美亚洲专区| 亚洲 国产 欧美 日韩| 精品播放一区二区| 国产黄色在线观看| 精品国产乱码久久久久久蜜臀| 91精品国产综合久久久久久| 日韩字幕在线观看| 日韩欧美国产不卡| av免费网站在线观看| 一区二区高清在线| 亚洲丝袜一区| 日韩在线视频网| 欧美日韩在线视频免费观看 | 欧美三级精品| 一二三区精品视频| 欧洲精品在线一区| 日韩在线视频一区二区三区| 国内精品99| 欧美日韩亚洲91| 国产精品一区二三区| 国产乱一区二区| 精品极品三级久久久久| 国产欧美日韩不卡免费| 国产福利不卡| 国产一级在线播放| 久久精品久久精品国产大片| 欧美日韩国产中文精品字幕自在自线| 伊人亚洲视频| 伊人精品视频| 福利在线国产| 中文字幕欧美日韩在线| 日韩三级一区| а√天堂8资源中文在线| 免费在线播放av| 91精品国产经典在线观看| 视频一区二区不卡| 中文字幕精品亚洲| 日韩精品手机在线| wwww亚洲| 在线视频三区| 交视频在线观看国产| 一区二区视频在线观看免费的| 欧美日韩精品在线观看| 日韩av一区二区在线观看| 黄色一区二区在线| 国产视频aaa| av三级在线播放| 成片免费观看| 亚洲国内精品视频| 午夜伊人狠狠久久| 精品国产91乱高清在线观看| 久久久99久久精品欧美| 国产对白在线| 国产性一级片| 中文字幕亚洲在| 国产三级精品在线观看| 国产对白在线| 一区二区视频在线| 亚洲国产欧美日韩在线| 日韩在线二区| 日本精品二区| 亚洲午夜久久| a视频免费看| 日韩精品福利视频| 亚洲视频资源在线| 久艹在线视频| 自拍日韩亚洲一区在线| 精品在线91| 亚洲国产欧美91| 日韩中文字幕网| 在线日韩中文字幕| 美国av一区二区| 亚洲第一香蕉网| 日韩高清在线不卡| 狠狠色综合色区| 日韩精品在线中文字幕| 伊人伊成久久人综合网小说| 精品国内自产拍在线视频| 日韩在线精品视频| 精品一二线国产| 欧美一级免费在线观看| 99日韩精品| 久久网站免费观看| 欧美二三四区| 国产xxx在线| 99精品一级欧美片免费播放| 亚洲乱码一区av黑人高潮| 日韩欧美中文视频| 亚洲欧美99| 国产亚洲人成a一在线v站| 九一精品国产| 亚洲免费婷婷| www中文字幕在线观看| 亚洲黄色一区二区| 久久久精品福利| 国内激情久久| 日韩欧美在线1卡| 精品久久久91| 国产在线一在线二| 国产一级网站视频在线| 中文字幕在线看精品乱码| 免费日韩精品中文字幕视频在线| 粉嫩粉嫩芽的虎白女18在线视频| 国产高清精品在线观看| 欧美日韩中文字幕| www日韩欧美| 亚洲国产午夜精品| 欧美日韩视频网站| 国产激情久久久| 国产在线二区| 日韩欧美字幕| 欧美一卡2卡3卡4卡| 亚洲高清不卡一区| 日韩黄色在线播放| 国产福利久久久| 日韩欧美国产综合| 国产欧美第一页| 日韩欧美一级精品久久| 亚洲免费中文字幕| 久久精品99久久久久久久久| 国产福利一区在线观看| 中文字幕日韩第一页| 亚洲va久久久噜噜噜久久| 久久久久久99精品| 日韩精品三级| 国产成人精品免费网站| 日韩精品视频在线免费观看| 精品人妻二区中文字幕| 亚洲综合在线小说| 国产裸舞福利在线视频合集| 日韩精品在线看|