青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆-167  評論-8  文章-0  trackbacks-0
維基百科,自由的百科全書

紅黑樹是一種自平衡二叉查找樹,是在計算機科學中用到的一種數據結構,典型的用途是實現關聯數組。它是在1972年 Robert Sedgewick 1978年寫的一篇論文中獲得的。它是復雜的,但它的操作有著良好的最壞情況運行時間,并且在實踐中是高效的: 它可以在O(log n)時間內做查找,插入和刪除,這里的n是樹中元素的數目。

目錄

 [隱藏]

[編輯]用途和好處

紅黑樹和AVL樹一樣都對插入時間、刪除時間和查找時間提供了最好可能的最壞情況擔保。這不只是使它們在時間敏感的應用如實時應用(real time application)中有價值,而且使它們有在提供最壞情況擔保的其他數據結構中作為建造板塊的價值;例如,在計算幾何中使用的很多數據結構都可以基于紅黑樹。

紅黑樹在函數式編程中也特別有用,在這里它們是最常用的持久數據結構之一,它們用來構造關聯數組集合,在突變之后它們能保持為以前的版本。除了O(log n)的時間之外,紅黑樹的持久版本對每次插入或刪除需要O(log n)的空間。

紅黑樹是 2-3-4樹的一種等同。換句話說,對于每個 2-3-4 樹,都存在至少一個數據元素是同樣次序的紅黑樹。在 2-3-4 樹上的插入和刪除操作也等同于在紅黑樹中顏色翻轉和旋轉。這使得 2-3-4 樹成為理解紅黑樹背后的邏輯的重要工具,這也是很多介紹算法的教科書在紅黑樹之前介紹 2-3-4 樹的原因,盡管 2-3-4 樹在實踐中不經常使用。

[編輯]性質

紅黑樹是每個節點都帶有顏色屬性的二叉查找樹,顏色或紅色黑色。在二叉查找樹強制一般要求以外,對于任何有效的紅黑樹我們增加了如下的額外要求:

性質1. 節點是紅色或黑色。

性質2. 根是黑色。

性質3. 所有葉子都是黑色(葉子是NIL節點)。

性質4. 每個紅色節點的兩個子節點都是黑色。(從每個葉子到根的所有路徑上不能有兩個連續的紅色節點)

性質5. 從任一節點到其每個葉子的所有簡單路徑都包含相同數目的黑色節點。

An example of a red-black tree

這些約束強制了紅黑樹的關鍵性質: 從根到葉子的最長的可能路徑不多于最短的可能路徑的兩倍長。結果是這個樹大致上是平衡的。因為操作比如插入、刪除和查找某個值的最壞情況時間都要求與樹的高度成比例,這個在高度上的理論上限允許紅黑樹在最壞情況下都是高效的,而不同于普通的二叉查找樹

要知道為什么這些特性確保了這個結果,注意到屬性4導致了路徑不能有兩個毗連的紅色節點就足夠了。最短的可能路徑都是黑色節點,最長的可能路徑有交替的紅色和黑色節點。因為根據屬性5所有最長的路徑都有相同數目的黑色節點,這就表明了沒有路徑能多于任何其他路徑的兩倍長。

在很多樹數據結構的表示中,一個節點有可能只有一個子節點,而葉子節點包含數據。用這種范例表示紅黑樹是可能的,但是這會改變一些屬性并使算法復雜。為此,本文中我們使用 "nil 葉子" 或"空(null)葉子",如上圖所示,它不包含數據而只充當樹在此結束的指示。這些節點在繪圖中經常被省略,導致了這些樹好像同上述原則相矛盾,而實際上不是這樣。與此有關的結論是所有節點都有兩個子節點,盡管其中的一個或兩個可能是空葉子。

[編輯]操作

因為每一個紅黑樹也是一個特化的二叉查找樹,因此紅黑樹上的只讀操作與普通二叉查找樹上的只讀操作相同。然而,在紅黑樹上進行插入操作和刪除操作會導致不再符合紅黑樹的性質。恢復紅黑樹的屬性需要少量(O(log n))的顏色變更(實際是非常快速的)和不超過三次樹旋轉(對于插入操作是兩次)。雖然插入和刪除很復雜,但操作時間仍可以保持為 O(log n) 次。

[編輯]插入

我們首先以二叉查找樹的方法增加節點并標記它為紅色。(如果設為黑色,就會導致根到葉子的路徑上有一條路上,多一個額外的黑節點,這個是很難調整的。但是設為紅色節點后,可能會導致出現兩個連續紅色節點的沖突,那么可以通過顏色調換(color flips)和樹旋轉來調整。) 下面要進行什么操作取決于其他臨近節點的顏色。同人類的家族樹中一樣,我們將使用術語叔父節點來指一個節點的父節點的兄弟節點。注意:

  • 性質1[1]和性質3[2]總是保持著。
  • 性質4[3]只在增加紅色節點、重繪黑色節點為紅色,或做旋轉時受到威脅。
  • 性質5[4]只在增加黑色節點、重繪紅色節點為黑色,或做旋轉時受到威脅。

在下面的示意圖中,將要插入的節點標為NN的父節點標為PN的祖父節點標為GN的叔父節點標為U。在圖中展示的任何顏色要么是由它所處情形所作的假定,要么是這些假定所暗含 (imply) 的。

對于每一種情況,我們將使用 C 示例代碼來展示。通過下列函數,可以找到一個節點的叔父和祖父節點:

 node grandparent(node n) {
     return n->parent->parent;
 }
 
 node uncle(node n) {
     if (n->parent == grandparent(n)->left)
         return grandparent(n)->right;
     else
         return grandparent(n)->left;
 }

情形1: 新節點N位于樹的根上,沒有父節點。在這種情形下,我們把它重繪為黑色以滿足性質2[5]。因為它在每個路徑上對黑節點數目增加一,性質5[4]符合。

 void insert_case1(node n) {
     if (n->parent == NULL)
         n->color = BLACK;
     else
         insert_case2(n);
 }

情形2: 新節點的父節點P是黑色,所以性質4[3]沒有失效(新節點是紅色的)。在這種情形下,樹仍是有效的。性質5[4]受到威脅,因為新節點N有兩個黑色葉子兒子;但是由于新節點N是紅色,通過它的每個子節點的路徑就都有同通過它所取代的黑色的葉子的路徑同樣數目的黑色節點,所以這個性質依然滿足。

 void insert_case2(node n) {
     if (n->parent->color == BLACK)
         return; /* 樹仍舊有效 */
     else
         insert_case3(n);
 }

注意: 在下列情形下我們假定新節點有祖父節點,因為父節點是紅色;并且如果它是根,它就應當是黑色。所以新節點總有一個叔父節點,盡管在情形4和5下它可能是葉子。

情況 3 示意圖

情形3: 如果父節點P和叔父節點U二者都是紅色,(此時新插入節點N做為P的左子節點或右子節點都屬于情形3,這里右圖僅顯示N做為P左子的情形)則我們可以將它們兩個重繪為黑色并重繪祖父節點G為紅色(用來保持性質5[4])。現在我們的新節點N有了一個黑色的父節點P。因為通過父節點P或叔父節點U的任何路徑都必定通過祖父節點G,在這些路徑上的黑節點數目沒有改變。但是,紅色的祖父節點G的父節點也有可能是紅色的,這就違反了性質4[3]。為了解決這個問題,我們在祖父節點G上遞歸地進行情形1的整個過程。(把G當成是新加入的節點進行各種情況的檢查)

 void insert_case3(node n) {
     if (uncle(n) != NULL && uncle(n)->color == RED) {
         n->parent->color = BLACK;
         uncle(n)->color = BLACK;
         grandparent(n)->color = RED;
         insert_case1(grandparent(n));
     }
     else
         insert_case4(n);
 }

注意: 在余下的情形下,我們假定父節點P 是其父親G 的左子節點。如果它是右子節點,情形4情形5中的應當對調。

說明: 情形4是將是將現有情況轉化為情形5情形5的問題本質上是有連續的紅色結點,樹不再等高(不再平衡),故需翻轉以保持平衡。

情況 4 示意圖

情形4: 父節點P是紅色而叔父節點U是黑色或缺少; 還有,新節點N是其父節點P的右子節點,而父節點P又是其父節點的左子節點。在這種情形下,我們進行一次左旋轉調換新節點和其父節點的角色; 接著,我們按情形5處理以前的父節點P。這導致某些路徑通過它們以前不通過的新節點N或父節點P中的一個,但是這兩個節點都是紅色的,所以性質5[4]沒有失效。

 void insert_case4(node n) {
     if (n == n->parent->right && n->parent == grandparent(n)->left) {
         rotate_left(n->parent);
         n = n->left;
     } else if (n == n->parent->left && n->parent == grandparent(n)->right) {
         rotate_right(n->parent);
         n = n->right;
     }
     insert_case5(n);
 }
情況 5 示意圖

情形5: 父節點P是紅色而叔父節點U 是黑色或缺少,新節點N 是其父節點的左子節點,而父節點P又是其父節點G的左子節點。在這種情形下,我們進行針對祖父節點G 的一次右旋轉; 在旋轉產生的樹中,以前的父節點P現在是新節點N和以前的祖父節點G 的父節點。我們知道以前的祖父節點G是黑色,否則父節點P就不可能是紅色 (如果 P  G 都是紅色就違反了性質4,所以 G 必須是黑色)。我們切換以前的父節點P和祖父節點G的顏色,結果的樹滿足性質4[3]。性質5[4]也仍然保持滿足,因為通過這三個節點中任何一個的所有路徑以前都通過祖父節點G ,現在它們都通過以前的父節點P。在各自的情形下,這都是三個節點中唯一的黑色節點。

 void insert_case5(node n) {
     n->parent->color = BLACK;
     grandparent(n)->color = RED;
     if (n == n->parent->left && n->parent == grandparent(n)->left) {
         rotate_right(grandparent(n));
     } else {
         /* Here, n == n->parent->right && n->parent == grandparent(n)->right */
         rotate_left(grandparent(n));
     }
 }

注意插入實際上是原地算法,因為上述所有調用都使用了尾部遞歸

[編輯]刪除

如果需要刪除的節點有兩個兒子,那么問題可以被轉化成刪除另一個只有一個兒子的節點的問題(為了表述方便,這里所指的兒子,為非葉子節點的兒子)。對于二叉查找樹,在刪除帶有兩個非葉子兒子的節點的時候,我們找到要么在它的左子樹中的最大元素、要么在它的右子樹中的最小元素,并把它的值轉移到要刪除的節點中(如在這里所展示的那樣)。我們接著刪除我們從中復制出值的那個節點,它必定有少于兩個非葉子的兒子。因為只是復制了一個值而不違反任何屬性,這就把問題簡化為如何刪除最多有一個兒子的節點的問題。它不關心這個節點是最初要刪除的節點還是我們從中復制出值的那個節點。

在本文余下的部分中,我們只需要討論刪除只有一個兒子的節點(如果它兩個兒子都為空,即均為葉子,我們任意將其中一個看作它的兒子)。如果我們刪除一個紅色節點(此時該節點的兒子將都為葉子節點),它的父親和兒子一定是黑色的。所以我們可以簡單的用它的黑色兒子替換它,并不會破壞屬性3和4。通過被刪除節點的所有路徑只是少了一個紅色節點,這樣可以繼續保證屬性5。另一種簡單情況是在被刪除節點是黑色而它的兒子是紅色的時候。如果只是去除這個黑色節點,用它的紅色兒子頂替上來的話,會破壞屬性5,但是如果我們重繪它的兒子為黑色,則曾經通過它的所有路徑將通過它的黑色兒子,這樣可以繼續保持屬性5。

需要進一步討論的是在要刪除的節點和它的兒子二者都是黑色的時候,這是一種復雜的情況。我們首先把要刪除的節點替換為它的兒子。出于方便,稱呼這個兒子為N,稱呼它的兄弟(它父親的另一個兒子)為S。在下面的示意圖中,我們還是使用P稱呼N的父親,SL稱呼S的左兒子,SR稱呼S的右兒子。我們將使用下述函數找到兄弟節點:

struct node *
sibling(struct node *n)
{
        if (n == n->parent->left)
                return n->parent->right;
        else
                return n->parent->left;
}

我們可以使用下列代碼進行上述的概要步驟,這里的函數 replace_node 替換 child  n 在樹中的位置。出于方便,在本章節中的代碼將假定空葉子被用不是 NULL 的實際節點對象來表示(在插入章節中的代碼可以同任何一種表示一起工作)。

void
delete_one_child(struct node *n)
{
        /*
         * Precondition: n has at most one non-null child.
         */
        struct node *child = is_leaf(n->right) ? n->left : n->right;
 
        replace_node(n, child);
        if (n->color == BLACK) {
                if (child->color == RED)
                        child->color = BLACK;
                else
                        delete_case1(child);
        }
        free(n);
}

如果 N 和它初始的父親是黑色,則刪除它的父親導致通過 N 的路徑都比不通過它的路徑少了一個黑色節點。因為這違反了屬性 4,樹需要被重新平衡。有幾種情況需要考慮:

情況 1: N 是新的根。在這種情況下,我們就做完了。我們從所有路徑去除了一個黑色節點,而新根是黑色的,所以屬性都保持著。

void
delete_case1(struct node *n)
{
        if (n->parent != NULL)
                delete_case2(n);
}

注意: 在情況2、5和6下,我們假定 N 是它父親的左兒子。如果它是右兒子,則在這些情況下的應當對調。

情況 2 示意圖

情況 2: S 是紅色。在這種情況下我們在N的父親上做左旋轉,把紅色兄弟轉換成N的祖父。我們接著對調 N 的父親和祖父的顏色。盡管所有的路徑仍然有相同數目的黑色節點,現在 N 有了一個黑色的兄弟和一個紅色的父親,所以我們可以接下去按 4、5或6情況來處理。(它的新兄弟是黑色因為它是紅色S的一個兒子。)

void
delete_case2(struct node *n)
{
        struct node *s = sibling(n);
 
        if (s->color == RED) {
                n->parent->color = RED;
                s->color = BLACK;
                if (n == n->parent->left)
                        rotate_left(n->parent);
                else
                        rotate_right(n->parent);
        } 
        delete_case3(n);
}
情況 3 示意圖

情況 3: N 的父親、S 和 S 的兒子都是黑色的。在這種情況下,我們簡單的重繪 S 為紅色。結果是通過S的所有路徑,它們就是以前通過 N 的那些路徑,都少了一個黑色節點。因為刪除 N 的初始的父親使通過 N 的所有路徑少了一個黑色節點,這使事情都平衡了起來。但是,通過 P 的所有路徑現在比不通過 P 的路徑少了一個黑色節點,所以仍然違反屬性4。要修正這個問題,我們要從情況 1 開始,在 P 上做重新平衡處理。

void
delete_case3(struct node *n)
{
        struct node *s = sibling(n);
 
        if ((n->parent->color == BLACK) &&
            (s->color == BLACK) &&
            (s->left->color == BLACK) &&
            (s->right->color == BLACK)) {
                s->color = RED;
                delete_case1(n->parent);
        } else
                delete_case4(n);
}
情況 4 示意圖

情況 4: S 和 S 的兒子都是黑色,但是 N 的父親是紅色。在這種情況下,我們簡單的交換 N 的兄弟和父親的顏色。這不影響不通過 N 的路徑的黑色節點的數目,但是它在通過 N 的路徑上對黑色節點數目增加了一,添補了在這些路徑上刪除的黑色節點。

void
delete_case4(struct node *n)
{
        struct node *s = sibling(n);
 
        if ((n->parent->color == RED) &&
            (s->color == BLACK) &&
            (s->left->color == BLACK) &&
            (s->right->color == BLACK)) {
                s->color = RED;
                n->parent->color = BLACK;
        } else
                delete_case5(n);
}
情況 5 示意圖

情況 5: S 是黑色,S 的左兒子是紅色,S 的右兒子是黑色,而 N 是它父親的左兒子。在這種情況下我們在 S 上做右旋轉,這樣 S 的左兒子成為 S 的父親和 N 的新兄弟。我們接著交換 S 和它的新父親的顏色。所有路徑仍有同樣數目的黑色節點,但是現在 N 有了一個右兒子是紅色的黑色兄弟,所以我們進入了情況 6。N 和它的父親都不受這個變換的影響。

void
delete_case5(struct node *n)
{
        struct node *s = sibling(n);
 
        if  (s->color == BLACK) /* this if statement is trivial, 
due to Case 2 (even though Case two changed the sibling to a sibling's child, 
the sibling's child can't be red, since no red parent can have a red child). */
// the following statements just force the red to be on the left of the left of the parent, 
// or right of the right, so case six will rotate correctly.
                if ((n == n->parent->left) &&
                    (s->right->color == BLACK) &&
                    (s->left->color == RED)) { // this last test is trivial too due to cases 2-4.
                        s->color = RED;
                        s->left->color = BLACK;
                        rotate_right(s);
                } else if ((n == n->parent->right) &&
                           (s->left->color == BLACK) &&
                           (s->right->color == RED)) {// this last test is trivial too due to cases 2-4.
                        s->color = RED;
                        s->right->color = BLACK;
                        rotate_left(s);
                }
        }
        delete_case6(n);
}
情況 6 示意圖

情況 6: S 是黑色,S 的右兒子是紅色,而 N 是它父親的左兒子。在這種情況下我們在 N 的父親上做左旋轉,這樣 S 成為 N 的父親和 S 的右兒子的父親。我們接著交換 N 的父親和 S 的顏色,并使 S 的右兒子為黑色。子樹在它的根上的仍是同樣的顏色,所以屬性 3 沒有被違反。但是,N 現在增加了一個黑色祖先: 要么 N 的父親變成黑色,要么它是黑色而 S 被增加為一個黑色祖父。所以,通過 N 的路徑都增加了一個黑色節點。

此時,如果一個路徑不通過 N,則有兩種可能性:

  • 它通過 N 的新兄弟。那么它以前和現在都必定通過 S 和 N 的父親,而它們只是交換了顏色。所以路徑保持了同樣數目的黑色節點。
  • 它通過 N 的新叔父,S 的右兒子。那么它以前通過 S、S 的父親和 S 的右兒子,但是現在只通過 S,它被假定為它以前的父親的顏色,和 S 的右兒子,它被從紅色改變為黑色。合成效果是這個路徑通過了同樣數目的黑色節點。

在任何情況下,在這些路徑上的黑色節點數目都沒有改變。所以我們恢復了屬性 4。在示意圖中的白色節點可以是紅色或黑色,但是在變換前后都必須指定相同的顏色。

void
delete_case6(struct node *n)
{
        struct node *s = sibling(n);
 
        s->color = n->parent->color;
        n->parent->color = BLACK;
 
        if (n == n->parent->left) {
                s->right->color = BLACK;
                rotate_left(n->parent);
        } else {
                s->left->color = BLACK;
                rotate_right(n->parent);
        }
}

同樣的,函數調用都使用了尾部遞歸,所以算法是就地的。此外,在旋轉之后不再做遞歸調用,所以進行了恒定數目(最多 3 次)的旋轉。

[編輯]漸進邊界的證明

包含n個內部節點的紅黑樹的高度是 O(log(n))。

定義:

  • h(v) = 以節點v為根的子樹的高度。
  • bh(v) = 從v到子樹中任何葉子的黑色節點的數目(如果v是黑色則不計數它)(也叫做黑色高度)。

引理: 以節點v為根的子樹有至少2bh(v) − 1個內部節點。

引理的證明(通過歸納高度):

基礎: h(v) = 0

如果v的高度是零則它必定是 nil,因此 bh(v) = 0。所以:

2bh(v) − 1 = 20 − 1 = 1 − 1 = 0

歸納假設: h(v) = k 的v 2bh(v) − 1 − 1 個內部節點暗示了 h(v') = k+1 的 v'2bh(v') − 1 個內部節點。

因為 v' 有 h(v') > 0 所以它是個內部節點。同樣的它有黑色高度要么是 bh(v') 要么是 bh(v')-1 (依據v'是紅色還是黑色)的兩個兒子。通過歸納假設每個兒子都有至少 2bh(v') − 1 − 1 個內部接點,所以 v' 有:

2bh(v') − 1 − 1 + 2bh(v') − 1 − 1 + 1 = 2bh(v') − 1

個內部節點。

使用這個引理我們現在可以展示出樹的高度是對數性的。因為在從根到葉子的任何路徑上至少有一半的節點是黑色(根據紅黑樹屬性4),根的黑色高度至少是h(root)/2。通過引理我們得到:


n \geq 2^{{h(root) \over 2}} - 1 \leftrightarrow \; \log{(n+1)} \geq {h(root) \over 2} \leftrightarrow \; h(root) \leq 2\log{(n+1)}

因此根的高度是O(log(n))。

[編輯]參見

[編輯]注釋

  1. ^ 性質1. 節點是紅色或黑色。
  2. ^ 性質3. 所有葉子都是黑色。
  3. ^ 3.0 3.1 3.2 3.3 性質4. 每個紅色節點的兩個子節點都是黑色。
  4. ^ 4.0 4.1 4.2 4.3 4.4 4.5 性質5. 從每個葉子到根的所有路徑都包含相同數目的黑色節點。
  5. ^ 性質2. 根是黑色。

[編輯]引用

[編輯]外部鏈接

posted on 2011-05-20 17:19 老馬驛站 閱讀(452) 評論(0)  編輯 收藏 引用 所屬分類: c++algorithm
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            136国产福利精品导航| 老司机精品久久| 美国十次了思思久久精品导航| 亚洲婷婷在线| 欧美黄色成人网| 欧美www在线| 精品91在线| 欧美一区二区三区免费观看视频| 亚洲欧美成人综合| 欧美日韩一区二区在线| 亚洲国产免费看| 伊人婷婷欧美激情| 欧美在线观看网址综合| 久久精品国产精品亚洲精品| 欧美性猛交xxxx乱大交蜜桃| 99re热这里只有精品免费视频| 亚洲精选久久| 欧美精品激情| 亚洲人体影院| 一区二区电影免费观看| 欧美久久久久久蜜桃| 亚洲日本中文字幕| 一区二区av| 欧美午夜久久| 亚洲一区二区在线免费观看视频| 亚洲欧美日韩精品久久| 国产精品扒开腿爽爽爽视频| 亚洲天堂成人在线观看| 午夜精品久久久久久久99樱桃| 国产精品美女久久福利网站| 亚洲网站在线看| 久久精品国产2020观看福利| 国产日韩在线一区| 久久久久久久综合| 亚洲福利视频二区| 一本久久综合亚洲鲁鲁| 国产精品sss| 性欧美大战久久久久久久免费观看| 久久精品天堂| 亚洲国产欧美日韩另类综合| 欧美久久一区| 亚洲一区二区三区四区五区午夜 | 亚洲精品在线观| 欧美人与性动交cc0o| 一区二区三区高清| 久久国产精品72免费观看| 国产最新精品精品你懂的| 久久综合伊人77777麻豆| 亚洲国产综合在线看不卡| 亚洲一区二区三区中文字幕在线 | 亚洲欧美久久久久一区二区三区| 国产精品自拍小视频| 久久精品国产免费看久久精品| 欧美激情一区二区三区高清视频| 亚洲视频电影图片偷拍一区| 国产亚洲午夜高清国产拍精品| 麻豆国产精品一区二区三区 | 欧美特黄视频| 久久久噜噜噜久噜久久| 99视频精品在线| 久久一区二区三区国产精品| 亚洲久久一区| 国产婷婷色一区二区三区四区| 欧美成人激情视频免费观看| 亚洲伊人第一页| 欧美国产日韩精品| 午夜在线播放视频欧美| 亚洲精品国产无天堂网2021| 国产亚洲欧美一区二区| 欧美日韩小视频| 久久久视频精品| 亚洲午夜伦理| 亚洲精选91| 男人的天堂成人在线| 午夜精品999| 一区二区三区欧美| 亚洲人成网站影音先锋播放| 国产主播一区| 国产精品日日摸夜夜添夜夜av| 欧美电影打屁股sp| 久久综合狠狠综合久久综合88| 性欧美videos另类喷潮| 亚洲最新视频在线| 亚洲人成高清| 亚洲国产经典视频| 欧美va天堂| 噜噜噜躁狠狠躁狠狠精品视频 | 亚洲一区二区三区涩| 亚洲国产精品一区二区尤物区| 国产无遮挡一区二区三区毛片日本| 国产精品igao视频网网址不卡日韩| 欧美激情视频在线免费观看 欧美视频免费一| 午夜精品久久久| 亚洲欧美乱综合| 亚洲综合久久久久| 亚洲天堂成人在线视频| 这里只有精品视频| 99热在这里有精品免费| 亚洲精品一区二区三区樱花| 亚洲高清不卡av| 91久久精品美女| 亚洲国产一区二区在线| 91久久夜色精品国产九色| 欧美国产成人在线| 亚洲国产精品传媒在线观看| 欧美大尺度在线观看| 欧美国产日韩精品免费观看| 欧美国产一区视频在线观看| 欧美大片国产精品| 亚洲国产黄色片| 亚洲蜜桃精久久久久久久| 日韩一级精品视频在线观看| 一区二区三区四区国产| 中日韩美女免费视频网站在线观看| 在线一区二区三区四区| 中文在线一区| 欧美亚洲综合网| 久久久999精品视频| 欧美a级在线| 欧美日韩另类视频| 国产精品福利在线| 国产一区二区三区久久| 精品91在线| 99热在线精品观看| 亚洲在线视频一区| 久久久久九九视频| 欧美成人午夜激情在线| 亚洲青色在线| 午夜国产精品视频| 久久嫩草精品久久久久| 欧美激情女人20p| 国产精品久久久久久久久动漫| 国产日韩一区二区三区| 亚洲国产精品一区在线观看不卡| 一本色道久久综合狠狠躁篇怎么玩 | 日韩亚洲欧美成人| 午夜在线视频观看日韩17c| 久久露脸国产精品| 欧美日韩在线观看一区二区| 国产香蕉97碰碰久久人人| 亚洲电影网站| 亚洲欧美精品| 欧美成人资源| 午夜精品久久久久久久| 欧美国产日韩在线| 国产香蕉97碰碰久久人人| 日韩午夜av电影| 久久国产精品久久久久久久久久| 亚洲高清网站| 欧美亚洲免费在线| 欧美日韩一区二区在线 | 亚洲人成亚洲人成在线观看图片 | 亚洲电影激情视频网站| 亚洲专区在线| 欧美国产丝袜视频| 国产一区激情| 亚洲字幕一区二区| 欧美激情精品久久久| 亚洲欧美日韩在线不卡| 欧美激情一区二区三区在线视频观看| 国产日韩欧美一区二区| 一本色道久久综合狠狠躁篇怎么玩 | 亚洲电影免费在线| 香蕉成人久久| 日韩视频专区| 欧美国产日韩精品免费观看| 韩日欧美一区| 亚洲欧美清纯在线制服| 亚洲精品国产精品国产自| 久久野战av| 合欧美一区二区三区| 欧美激情亚洲精品| 国产伊人精品| 亚洲免费网站| 99亚洲一区二区| 欧美精品日本| 日韩一区二区免费高清| 免费成人美女女| 久久久国产精品一区二区中文 | 午夜日韩视频| 国产精品乱码一区二区三区 | 欧美一级在线播放| 99视频精品全国免费| 欧美日韩福利视频| 日韩午夜免费| 亚洲国产精品va在线观看黑人 | 欧美喷水视频| 日韩一级黄色大片| 亚洲三级网站| 欧美日韩系列| 亚洲欧美高清| 亚洲欧美中文日韩v在线观看| 国产精品都在这里| 亚洲欧美日韩国产综合| 亚洲免费一级电影| 国产日韩精品视频一区| 久久成人久久爱| 久久久国产精品一区二区三区| 一区二区在线免费观看| 你懂的视频欧美|