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

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

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

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

|---Fruit

| |---Red

| | |--Cherry

| +---Yellow

| +--Banana

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

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

三、實(shí)現(xiàn)
1、毗鄰目錄模式(adjacency list model)
這種模式我們經(jīng)常用到,很多的教程和書(shū)中也介紹過(guò)。我們通過(guò)給每個(gè)節(jié)點(diǎn)增加一個(gè)屬性 parent 來(lái)表示這個(gè)節(jié)點(diǎn)的父節(jié)點(diǎn)從而將整個(gè)樹(shù)狀結(jié)構(gòu)通過(guò)平面的表描述出來(lái)。根據(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'沒(méi)有父節(jié)點(diǎn)。 為了簡(jiǎn)單地描述這個(gè)問(wèn)題,這個(gè)例子中只用了name來(lái)表示一個(gè)記錄。 在實(shí)際的數(shù)據(jù)庫(kù)中,你需要用數(shù)字的id來(lái)標(biāo)示每個(gè)節(jié)點(diǎn),數(shù)據(jù)庫(kù)的表結(jié)構(gòu)大概應(yīng)該像這樣:id, parent_id, name, descrīption。
有了這樣的表我們就可以通過(guò)數(shù)據(jù)庫(kù)保存整個(gè)多級(jí)樹(shù)狀結(jié)構(gòu)了。
顯示多級(jí)樹(shù),如果我們需要顯示這樣的一個(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í)樹(shù)結(jié)構(gòu),由于Food是根節(jié)點(diǎn)它的父節(jié)點(diǎn)是空的,所以這樣調(diào)用: display_children('',0)。將顯示整個(gè)樹(shù)的內(nèi)容:
復(fù)制代碼 代碼如下:
Food
Fruit
Red
Cherry
Yellow
Banana
Meat
Beef
Pork

如果你只想顯示整個(gè)結(jié)構(gòu)中的一部分,比如說(shuō)水果部分,就可以這樣調(diào)用:display_children('Fruit',0);
幾乎使用同樣的方法我們可以知道從根節(jié)點(diǎn)到任意節(jié)點(diǎn)的路徑。比如 Cherry 的路徑是 "Food Fruit Red"。 為了得到這樣的一個(gè)路徑我們需要從最深的一級(jí)"Cherry"開(kāi)始, 查詢得到它的父節(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)沒(méi)有父節(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
)

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

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

我們首先將多級(jí)數(shù)據(jù)按照下面的方式畫(huà)在紙上,在根節(jié)點(diǎn)Food的左側(cè)寫上 1 然后沿著這個(gè)樹(shù)繼續(xù)向下 在 Fruit 的左側(cè)寫上 2 然后繼續(xù)前進(jìn),沿著整個(gè)樹(shù)的邊緣給每一個(gè)節(jié)點(diǎn)都標(biāo)上左側(cè)和右側(cè)的數(shù)字。最后一個(gè)數(shù)字是標(biāo)在Food 右側(cè)的 18。在下面的這張圖中你可以看到整個(gè)標(biāo)好了數(shù)字的多級(jí)結(jié)構(gòu)。(沒(méi)有看懂?用你的手指指著數(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è)樹(shù)狀結(jié)構(gòu)可以通過(guò)左右值來(lái)存儲(chǔ)到數(shù)據(jù)庫(kù)中。繼續(xù)之前,我們看一看下面整理過(guò)的數(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"來(lái)表示左右字段。 另外這種結(jié)構(gòu)中不再需要"parent"字段來(lái)表示樹(shù)狀結(jié)構(gòu)。也就是 說(shuō)下面這樣的表結(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ù)庫(kù)中獲取數(shù)據(jù)了,例如我們需要得到"Fruit"項(xiàng)下的所有所有節(jié)點(diǎn)就可以這樣寫查詢語(yǔ)句:
復(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è)樹(shù)狀結(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;

剩下的問(wèn)題如何顯示層級(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ù)庫(kù)查詢。
要獲知一個(gè)節(jié)點(diǎn)的路徑就更簡(jiǎn)單了,如果我們想知道Cherry 的路徑就利用它的左右值4和5來(lái)做一個(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)沒(méi)有子孫節(jié)點(diǎn),也就是說(shuō)它不是一個(gè)父節(jié)點(diǎn)了。
很神奇吧?雖然我已經(jīng)多次用過(guò)這個(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)開(kāi)始運(yùn)行這個(gè)函數(shù)來(lái)重建一個(gè)帶有左右值的樹(shù)
復(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ù)值。舉例來(lái)說(shuō):我們想增加一種新的水果"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ù)庫(kù)操作:
復(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é)語(yǔ)
好了,現(xiàn)在你可以用兩種不同的方法設(shè)計(jì)你的多級(jí)數(shù)據(jù)庫(kù)結(jié)構(gòu)了,采用何種方式完全取決于你個(gè)人的判斷,但是對(duì)于層次多數(shù)量大的結(jié)構(gòu)我更喜歡第二種方法。如果查詢量較小但是需要頻繁添加和更新的數(shù)據(jù),則第一種方法更為簡(jiǎn)便。
另外,如果數(shù)據(jù)庫(kù)支持的話 你還可以將rebuild_tree()和 騰出空間的操作寫成數(shù)據(jù)庫(kù)端的觸發(fā)器函數(shù), 在插入和更新的時(shí)候自動(dòng)執(zhí)行, 這樣可以得到更好的運(yùn)行效率, 而且你添加新節(jié)點(diǎn)的SQL語(yǔ)句會(huì)變得更加簡(jiǎn)單。
PHP教程

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

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
成人av电影观看| 国产精品视频专区| 天天做天天摸天天爽天天爱| 日韩av片免费观看| 亚洲成人av资源网| 精品影院一区| www五月天com| 欧美视频免费| 在线观看国产精品入口男同| 国产亚洲第一伦理第一区| 色综合久久88色综合天天6| 人善交video高清| av色影在线看免费| 黄色片在线观看免费| 欧美一区二区三区在线免费观看| 福利视频在线导航| 国产精久久久久| 91国内精品久久久| 成人午夜在线| 99re在线国产| 欧美日韩国产一区二区三区| 飘雪影院手机免费高清版在线观看| 日本黄色免费录像| 被男同事摸的水好多| 在线观看h网址| 久久中文字幕一区二区三区| 久久综合婷婷综合| 精产国品自在线www| h片在线观看免费| 欧美人与禽zozzo禽性配| 男女激情无遮挡| 色哟哟在线观看| 久久久久99人妻一区二区三区| 黄色成人精品网站| 日韩av.com| 欧美wwwsss9999| www亚洲欧美| 97超碰国产一区二区三区| 视频污在线观看| jizz欧美性20| 六十路在线观看| 欧美午夜18电影| 9l亚洲国产成人精品一区二三| 婷婷社区五月天| 樱花草在线观看www| 亚洲自拍欧美精品| 国产一级视频| 国产乱子伦农村叉叉叉| xxxx.国产| 久久亚洲精品国产精品紫薇| 一区二区三区四区国产精品| 国产98在线|日韩| 国产精品久久久久一区| 婷婷亚洲五月色综合| 在线观看亚洲精品| 黑人巨大精品欧美一区二区桃花岛| 成人免费一级片| 亚洲精品天堂网| 欧美一卡2卡三卡4卡5免费| 久久精品国产成人一区二区三区| 欧美视频免费看欧美视频| 1000部国产精品成人观看| 九九视频免费观看视频精品| 成人爽a毛片一区二区| 欧美亚洲国产免费| 少妇高潮惨叫久久久久| 91在线观看免费高清| 成人影院在线观看视频| 亚洲国产精品精华液网站| 欧美www视频在线观看| 色狠狠av一区二区三区| 秋霞成人午夜伦在线观看| 最新中文字幕在线| 亚洲国产裸拍裸体视频在线观看乱了中文| 精品免费久久久| 污污的网站在线免费观看| 国产日韩精品视频一区| 国产成人亚洲精品自产在线| 国产日产精品一区二区三区四区| 日韩一区二区三区高清在线观看| 亚洲一二三专区| 中文文精品字幕一区二区| 免费男女羞羞的视频网站中文子暮| 精品伊人久久久| 成年人免费av| 日日噜噜噜夜夜爽爽| 男人的天堂免费| 日本免费网站在线观看| 国产成人1区| 国产理论在线播放| 日韩欧美电影一区二区| 一区在线观看免费| 亚洲第一在线播放| 亚洲一区二区少妇| 青青草原在线免费观看视频| 91麻豆国产自产在线观看亚洲| 亚洲中文一区二区三区| 亚洲综合在线观看视频| 影音先锋中文字幕一区| 天堂在线中文网| 91婷婷韩国欧美一区二区| 97香蕉久久超级碰碰高清版| 欧美人与动牲交xxxxbbbb| aaaa黄色片| 伊人资源视频在线| 日韩精品一区在线| 久久99999| 色88888久久久久久影院野外| 亚洲图片小说视频| 国产性生活免费视频| 精品中文字幕一区二区小辣椒| 免费看污污网站| 日韩欧美高清视频| 精品人妻在线视频| 国产精品久久午夜| 777影院狠狠色| 欧美涩涩网站| 综合久久综合| 亚洲一二三四区| 啊v在线视频| 作爱视频免费观看视频在线播放激情网| 精品一区二区免费视频| 一区二区视频在线观看免费的| 久久伊人国产| 日韩jizzz| av一线二线| 精品视频麻豆入口| 亚洲v日韩v综合v精品v| 丰满人妻一区二区三区免费| 啪一啪鲁一鲁2019在线视频| 国产美女撒尿一区二区| 九色网友自拍视频手机在线| 污网站在线免费看| 波多野结衣av无码| 国产福利久久久| 国产精品对白刺激| 久久嫩草精品久久久精品一| av在线你懂的| 日本免费一二区| 天天干天天草天天射| 97色婷婷成人综合在线观看| www日本高清视频| 日韩电影大片中文字幕| 欧美sm美女调教| 免费成人结看片| 不卡中文字幕| 黑人精品无码一区二区三区AV| 日本xxxxwwww| 久热精品视频在线观看一区| 亚洲精品1区2区3区| 色噜噜狠狠一区二区三区| 国产99午夜精品一区二区三区| 337p粉嫩大胆噜噜噜噜噜91av| 亚洲精品午夜在线观看| 无码内射中文字幕岛国片| 人人爽久久涩噜噜噜网站| 国产福利一区二区| 最近最新mv在线观看免费高清| 91在线短视频| 男女啪啪999亚洲精品| 国产一区二区影视| 午夜羞羞小视频在线观看| 欧美黑人乱大交ⅹxxxxx| 欧美日韩网址| 国产a视频精品免费观看| 国产日韩在线一区| julia一区二区中文久久94| 在线成人av观看| 亚洲一区在线观看免费| 久久综合88| 免费男同深夜夜行网站| 国产三级精品在线不卡| 亚洲国产天堂久久国产91| 国产精品免费视频xxxx| 亚洲成人精品一区二区三区| 国产精品人人妻人人爽| 亚洲男人天堂2021| 麻豆国产传媒av福利| 999国产视频| 欧美视频中文一区二区三区在线观看| 国产黄色片网站| 伊人天天久久大香线蕉av色| 六月丁香婷婷激情| 涩涩视频在线观看免费| a黄色在线观看| 中日韩免视频上线全都免费| 亚洲色图偷窥自拍| 亚洲无线视频| 懂色av一区二区三区免费观看| 一区二区欧美精品| 大奶在线精品| 91国内产香蕉| 精品亚洲二区| jizz蜜桃视频在线观看| 国产91精品露脸国语对白| 欧美成年人在线观看| 欧美福利电影在线观看| 99在线观看精品视频| 色琪琪丁香婷婷综合久久| 亚洲成在人线在线播放| 天堂а√在线中文在线| 免费日本视频一区| 91精品国产九九九久久久亚洲| av岛国在线| 欧美日韩精品一区二区在线播放| 中文字幕精品三区| 最新国产拍偷乱拍精品| 免费一二一二在线视频| 一级毛片免费看| 日本精品视频| 亚洲激情网址| 成人av色在线观看| 日韩欧美国产综合在线一区二区三区| 欧美国产日韩中文字幕在线| av中文字幕电影在线看| 天堂入口网站| 欧美一级淫片aaaaaa| 欧美aaa在线| 国产成人啪精品午夜在线观看| 精品中文字幕在线观看| 日韩黄色一级大片| 午夜视频精品| 国产亚洲精品成人av久久ww| 午夜不卡av免费| 日韩欧美视频免费观看| 国产精品国产三级国产| 精品91久久久久| 久久久久久久午夜| 麻豆一区二区三| 久久精品国产亚洲5555| 亚洲黄色a级片| 国产精品99久久99久久久二8| 欧美精品色图| 香蕉成人伊视频在线观看| 奇米一区二区三区四区久久| 国产传媒久久文化传媒| 四色永久网址| 欧美午夜xxx| 欧美激情视频一区二区| 国产精品jizz在线观看老狼| 两女双腿交缠激烈磨豆腐| 久久网这里都是精品| 精品国产乱码久久久久酒店| 屁屁影院在线观看| 国产精品成人av在线| 亚洲国产精彩中文乱码av| 成人激情春色网| 国产在线视频网站| 2020中文字幕在线| 亚洲精品久久一区二区三区777| 麻豆精品国产| 国产偷国产偷精品高清尤物| 欧美日韩综合一区二区| 亚洲免费一级视频| 欧美高清在线视频| 91大神在线资源观看无广告| 国产精品日本一区二区| 日韩视频免费在线| 成人av在线影院| 日韩午夜在线| 新婚的少妇hd中文字幕| 欧美日韩成人综合在线一区二区| 一区二区高清视频| 看片网站在线观看| 337p日本欧洲亚洲大胆色噜噜| 亚洲另类中文字| 波多野结衣一区二区三区在线观看| 欧美一卡二卡三卡| 37pao成人国产永久免费视频| 欧美在线 | 亚洲| 午夜久久美女| 精品午夜一区二区三区| 日韩av电影在线观看| 在线综合视频播放| 成人在线tv视频| 欧美激情护士| eeuss影院18直达| ady日本映画久久精品一区二区| 夜色视频网站| 国产一区二区三区精品久久久| 国产资源在线一区| 国产成人av电影在线播放| 亚洲一区二区成人| 欧美三级午夜理伦三级在线观看| 香蕉免费一区二区三区在线观看| 欧美专区一二三| 亚洲精品高清无码视频| 成人激情午夜影院| 丝袜足控免费网站xx网站| 日韩福利小视频| 免费在线观看你懂的| www.黄色网址.com| 欧美日韩亚洲第一页| 免费观看黄一级视频| 福利在线播放| 久久精品久久综合| 欧美乱大交xxxxx另类| 91老司机福利在线| 国模无码大尺度一区二区三区| 久久久久久久久综合| 日产电影一区二区三区| 欧美18一19xxx性| 欧美精品九九久久| 国产喷水福利在线视频| 国产乱色在线观看| 久久99精品这里精品3| 精品三级av在线| 美女喷水网站| 黄色网页免费在线观看| 日日躁夜夜躁人人揉av五月天| 一级黄色a毛片| 亚洲精品日韩专区silk| 国产精品私人影院| 久久国产精品波多野结衣av| 一区二区不卡免费视频| 99热久久这里只有精品| 石原莉奈一区二区三区高清在线| 狠狠色狠狠色综合日日tαg| 大香伊人久久精品一区二区| 内射国产内射夫妻免费频道| 国产欧美日韩另类视频免费观看| 亚洲尤物视频在线| 欧美日韩日本网| 亚洲不卡视频在线| 日本高清+成人网在线观看| 亚洲 日本 欧美 中文幕| 欧美日韩电影一区二区| 一区二区不卡在线观看|