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

羅朝輝(飄飄白云)

關(guān)注嵌入式操作系統(tǒng),移動(dòng)平臺(tái),圖形開(kāi)發(fā)。-->加微博 ^_^

  C++博客 :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
  85 隨筆 :: 0 文章 :: 169 評(píng)論 :: 0 Trackbacks
 

樹(shù)算法之紅黑樹(shù)   

羅朝輝(http://www.shnenglu.com/kesalin

轉(zhuǎn)載請(qǐng)注明出處


紅黑樹(shù)本質(zhì)是二叉查找樹(shù)的一種,它的性能高于普通的二叉查找樹(shù),即使是在最壞的情況下也能保證時(shí)間復(fù)雜度為O(lgn)。紅黑樹(shù)在每個(gè)結(jié)點(diǎn)上增加一個(gè)存儲(chǔ)位表示結(jié)點(diǎn)的顏色(或紅或黑,故稱紅黑樹(shù))。通過(guò)對(duì)任何一條從根到葉子的路徑上各個(gè)結(jié)點(diǎn)著色方式的限制,紅黑樹(shù)可以保證沒(méi)有一條路徑會(huì)比其他路徑長(zhǎng)出兩倍,因而是接近平衡的。

紅黑樹(shù)的每個(gè)結(jié)點(diǎn)至少包含五個(gè)域:color,key,left,right 和 parent(一般我們都會(huì)在結(jié)點(diǎn)中存儲(chǔ)額外的數(shù)據(jù) data,但前面的五個(gè)域是必不可少的),如果某個(gè)結(jié)點(diǎn)沒(méi)有子結(jié)點(diǎn)或者結(jié)節(jié)點(diǎn),則將相應(yīng)的指針設(shè)置為空值(NIL,注意不是 NULL,NIL是一個(gè)特定的空結(jié)點(diǎn)對(duì)象,類似于Obj-C 中 Nil對(duì)象)。我們將這些 NIL 當(dāng)作葉子結(jié)點(diǎn)(在實(shí)際處理過(guò)程中,往往將最底層的孩子結(jié)點(diǎn)和根結(jié)點(diǎn)的父親都指向同一個(gè) NIL 結(jié)點(diǎn),以便于處理紅黑樹(shù)代碼中的邊界條件),而將其它結(jié)點(diǎn)當(dāng)作內(nèi)結(jié)點(diǎn)。

滿足如下 5 個(gè)性質(zhì)的二叉樹(shù)就是一顆紅黑樹(shù):
一,每個(gè)結(jié)點(diǎn)只有一種顏色,或紅色或黑色;
二,根結(jié)點(diǎn)是黑色的;
三,每個(gè)葉結(jié)點(diǎn)是黑色的;
四,如果一個(gè)結(jié)點(diǎn)是紅色的,那么它的兩個(gè)孩子結(jié)點(diǎn)必須是黑色的;
五,對(duì)每個(gè)結(jié)點(diǎn),從該結(jié)點(diǎn)到其子孫結(jié)點(diǎn)的所有路徑上包含相同數(shù)目 H 的黑色結(jié)點(diǎn), H 即為該節(jié)點(diǎn)的高度。

紅黑樹(shù)的實(shí)現(xiàn),linux 內(nèi)核中有現(xiàn)成實(shí)現(xiàn)算法,園子里也有不少同學(xué)(那誰(shuí) 等)實(shí)現(xiàn)過(guò)。在這里我重復(fù)制造一下輪子,當(dāng)然我這里的實(shí)現(xiàn)與前面提到的有些不同,這里是按照《算法導(dǎo)論》上的算法描述實(shí)現(xiàn)的。具體算法過(guò)程,請(qǐng)參考《算法導(dǎo)論》中紅黑樹(shù)那一章。

下面先來(lái)看頭文件中包含的數(shù)據(jù)結(jié)構(gòu),接口函數(shù):

#ifndef __RED_BLACK_TREE_H__
#define __RED_BLACK_TREE_H__

enum RBColor{
    RB_Red,
    RB_Black,
}
;

struct RBNode 
{
    RBColor color;
    
int key;
    RBNode
* leftChild;
    RBNode
* rightChild;
    RBNode
* parent;
}
;

typedef RBNode
* RBTree;

RBNode
* RBTree_nil();

// 最小關(guān)鍵字元素
RBNode* RBTree_minimum(RBNode* node);

// 最大關(guān)鍵字元素
RBNode* RBTree_maximum(RBNode* node);

// 中序遍歷中的前驅(qū)
RBNode* RBTree_predecessor(RBNode* node);

// 中序遍歷中的后繼
RBNode* RBTree_successor(RBNode* node);

void RBTree_insert(RBTree* tree, RBNode* node);

RBNode
* RBTree_delete(RBTree* tree, RBNode* node);

RBNode
* RBTree_search(const RBTree tree, int key);

void RBTree_print(RBTree tree, int her = 1);

#endif    // __RED_BLACK_TREE_H__

下面來(lái)看具體實(shí)現(xiàn):

#include "RedBlackTree.h"
#include 
<stdlib.h>
#include 
<stdio.h>
#include 
<assert.h>

static RBNode RBNode_Nil = {RB_Black, 0000};

RBNode
* RBTree_nil()
{
    
return &RBNode_Nil;
}


void RBTree_print(RBTree tree, int her)
{
    
int i;
    RBNode
* node = tree;

    assert(node);

    
if (node != &RBNode_Nil) {
        
for (i = 0; i < her; i++{
            printf(
" ");
        }

        printf(
"第 %d 層, %d(%c)\n",
            her, node
->key, node->color == RB_Black ? 'B' : 'R');

        
if (node->leftChild != &RBNode_Nil) {
            RBTree_print(node
->leftChild, her + 1);
        }


        
if (node->rightChild != &RBNode_Nil) {
            RBTree_print(node
->rightChild, her + 1);
        }

    }

}


// 最小關(guān)鍵字元素
RBNode* RBTree_minimum(RBNode* node)
{
    assert(node);

    RBNode
* temp = node;
    
while (temp->leftChild != &RBNode_Nil) {
        temp 
= temp->leftChild;
    }


    
return temp;
}



// 最大關(guān)鍵字元素
RBNode* RBTree_maximum(RBNode* node)
{
    assert(node);

    RBNode
* temp = node;
    
while (temp->rightChild != &RBNode_Nil) {
        temp 
= temp->rightChild;
    }


    
return temp;
}


// 中序遍歷中的前驅(qū)
RBNode* RBTree_predecessor(RBNode* node)
{
    assert(node);

    RBNode
* child = node->leftChild;

    
// 沒(méi)有左孩子,返回自身
    if (child == &RBNode_Nil) {
        
return node;
    }


    
// 只有左孩子,則左孩子是其直接前驅(qū)
    else if (child->rightChild == &RBNode_Nil) {
        
return child->leftChild;
    }


    
// 左右孩子均有,則右孩子樹(shù)中最大的元素為其直接前驅(qū)
    else {
        
return RBTree_maximum(child->rightChild);
    }

}


// 中序遍歷中的后繼
RBNode* RBTree_successor(RBNode* node)
{
    
// 有右孩子,則右孩子樹(shù)中最小的元素為其直接后繼
    if (node->rightChild != &RBNode_Nil) {
        
return RBTree_minimum(node->rightChild);
    }


    
// 沒(méi)有右孩子,向上找到的第一個(gè)左分支節(jié)點(diǎn)為其直接后繼,
    
// 即 node 為其直接后繼的左孩子樹(shù)中的最大元素。
    RBNode* temp = node;
    RBNode
* parent = temp->parent;

    
while (parent != &RBNode_Nil && temp == parent->rightChild) {
        temp 
= parent;
        parent 
= temp->parent;
    }


    
return parent;
}


RBNode
* RBTree_search(const RBTree tree, int key)
{
    RBNode
* node = tree;

    
while (node != &RBNode_Nil) {
        
if (node->key == key) {
            
return node;
        }


        
else if (node->key < key) {
            node 
= node->rightChild;
        }

        
else {
            node 
= node->leftChild;
        }

    }


    
return &RBNode_Nil;
}


// 左旋
//            node                        right
//           /    \                      /     \
//          a    right     -->         node     c
//              /     \               /    \
//             b       c             a      b
//
void RBTree_left_rotate(RBTree* tree, RBNode* node)
{
    assert(node
->rightChild && (*tree)->parent == &RBNode_Nil);

    RBNode
* right = node->rightChild;

    
// set b
    node->rightChild = right->leftChild;
    
if (right->leftChild != &RBNode_Nil) {
        right
->leftChild->parent = node;
    }


    right
->parent = node->parent;
    
if (node->parent == &RBNode_Nil) {
        
*tree = right;
    }

    
else if (node->parent->leftChild == node) {
        node
->parent->leftChild = right;
    }

    
else {
        node
->parent->rightChild = right;
    }


    right
->leftChild = node;
    node
->parent = right;
}


// 右旋
//            node                  left
//           /    \                /    \
//         left    c     -->      a     node
//        /     \                      /    \
//       a       b                    b      c
//
void RBTree_right_rotate(RBTree* tree, RBNode* node)
{
    assert(node
->leftChild && (*tree)->parent == &RBNode_Nil);

    RBNode
* left = node->leftChild;

    
// set b
    node->leftChild = left->rightChild;
    
if (left->rightChild != &RBNode_Nil) {
        left
->rightChild->parent = node;
    }


    left
->parent = node->parent;
    
if (node->parent == &RBNode_Nil) {
        
*tree = left;
    }

    
else if (node->parent->leftChild == node) {
        node
->parent->leftChild = left;
    }

    
else {
        node
->parent->rightChild = left;
    }


    left
->rightChild = node;
    node
->parent = left;
}


// 插入調(diào)整
void RBTree_insert_fixup(RBTree* tree, RBNode* node)
{
    assert(tree 
&& node);

    RBNode
* parent = NULL;
    RBNode
* uncle = NULL;
    RBNode
* grand = NULL;
    RBNode
* temp = NULL;

    parent 
= node->parent;
    
while (parent->color == RB_Red) {
        
// 根據(jù)紅黑樹(shù)性質(zhì),以及 node 的父親的顏色為紅色,
        
// 可以肯定 node 的祖父節(jié)點(diǎn)一定存在
        grand = parent->parent;

        
// 確定叔父節(jié)點(diǎn)
        if (parent == grand->leftChild) {
            uncle 
= grand->rightChild;

            
// case 1: 叔父節(jié)點(diǎn)為紅色
            
//         grand(B)        new node  ->    grand(R)
            
//         /     \                         /      \
            
//   parent(R)    uncle(R)    -->     node(B)   uncle(B)
            
//   /     \      /  \                /   \        /  \
             
//  a    node(R) d    e          parent  node(R)  d    e
            
//       /   \                          /   \
            
//      b     c                        b     c
            
//
            if (uncle->color == RB_Red) {
                parent
->color = RB_Black;
                uncle
->color = RB_Black;
                grand
->color = RB_Red;
                node 
= grand;
                parent 
= node->parent;
            }


            
// case 2, case 3:叔父節(jié)點(diǎn)為黑色
            
//         case 2     --->    case 3         -->  done
            
//                      parent is as new node
            
//         grand(B)          grand(B)            node(B)
            
//         /     \           /      \           /      \
             
//   parent(R)    d       node(R)   d      parent(R)  grand(R)
            
//   /     \               /     \           /  \      /   \
            
//  a    node(R)      parent(R)   c         a    b    c     d
             
//       /   \         /  \
            
//      b     c       a    b
            
//
            else {
                
// 將 case 2 裝換成 case 3
                if (parent->rightChild == node) {
                    RBTree_left_rotate(tree, parent);
                    temp 
= parent;
                    parent 
= node;
                    node 
= temp;
                }


                
// case 3
                parent->color = RB_Black;
                grand
->color = RB_Red;

                RBTree_right_rotate(tree, grand);
            }

        }

        
else {
            
// 與上面的情況對(duì)稱
            uncle = grand->leftChild;

            
if (uncle->color == RB_Red) {
                parent
->color = RB_Black;
                uncle
->color = RB_Black;
                grand
->color = RB_Red;
                node 
= grand;
                parent 
= node->parent;
            }


            
else {
                
// 將 case 2 裝換成 case 3
                if (parent->leftChild == node) {
                    RBTree_right_rotate(tree, parent);
                    temp 
= parent;
                    parent 
= node;
                    node 
= temp;
                }


                
// case 3
                parent->color = RB_Black;
                grand
->color = RB_Red;

                RBTree_left_rotate(tree, grand);
            }

        }

    }


    (
*tree)->color = RB_Black;
}


// 將節(jié)點(diǎn) node 插入樹(shù) tree 內(nèi),然后將 node 著色為紅色,此時(shí),樹(shù)可能不再
// 滿足紅黑樹(shù)性質(zhì),因此調(diào)用 RBTree_insert_fixup 來(lái)對(duì)節(jié)點(diǎn)重新著色調(diào)整。
void RBTree_insert(RBTree* tree, RBNode* node)
{
    assert(tree 
&& node);

    RBNode
* parent = &RBNode_Nil;
    RBNode
* temp = *tree;

    
// 像二叉樹(shù)一樣,在樹(shù)中查找適當(dāng)?shù)奈恢貌迦?/span>
    while (temp != &RBNode_Nil) {
        parent 
= temp;

        
if (node->key < temp->key) {
            temp 
= temp->leftChild;
        }

        
else {
            temp 
= temp->rightChild;
        }

    }


    node
->parent = parent;

    
// 樹(shù)為空
    if (parent == &RBNode_Nil) {
        
*tree = node;
    }

    
else if (node->key < parent->key) {
        parent
->leftChild = node;
    }

    
else {
        parent
->rightChild = node;
    }


    
// 為節(jié)點(diǎn)著色
    node->leftChild = &RBNode_Nil;
    node
->rightChild = &RBNode_Nil;
    node
->color = RB_Red;

    
// 調(diào)整樹(shù)使之滿足紅黑樹(shù)性質(zhì)
    RBTree_insert_fixup(tree, node);
}


// 刪除調(diào)整
void RBTree_delete_fixup(RBTree* tree, RBNode* node)
{
    RBNode
* brother = NULL;
    RBNode
* parent = NULL;

    
while (node != *tree && node->color == RB_Black) {
        parent 
= node->parent;

        
// 確定兄弟節(jié)點(diǎn)
        if (node == parent->leftChild) {
            brother 
= parent->rightChild;

            
// case 1: 兄弟節(jié)點(diǎn)為紅色
            if (brother->color == RB_Red) {
                brother
->color = RB_Black;
                parent
->color = RB_Red;

                RBTree_left_rotate(tree, parent);

                brother 
= node->parent->rightChild;
            }


            
// case 2: 兄弟節(jié)點(diǎn)的兩孩子均為黑色
            if (brother->leftChild->color == RB_Black
                
&& brother->rightChild->color == RB_Black) {
                    brother
->color = RB_Red;
                    node 
= parent;
            }


            
else {
                
// case 3: 兄弟節(jié)點(diǎn)的左孩子為紅色,右孩子為黑色
                if (brother->rightChild->color == RB_Black) {
                    brother
->leftChild->color = RB_Black;
                    brother
->color = RB_Red;

                    RBTree_right_rotate(tree, brother);

                    brother 
= node->parent->rightChild;
                }


                
// case 4:兄弟節(jié)點(diǎn)的右孩子為紅色
                brother->color = parent->color;
                parent
->color = RB_Black;
                brother
->rightChild->color = RB_Black;

                RBTree_left_rotate(tree, parent);

                node 
= *tree;
            }

        }

        
else {
            brother 
= node->parent->leftChild;

            
// case 1: 兄弟節(jié)點(diǎn)為紅色
            if (brother->color == RB_Red) {
                brother
->color = RB_Black;
                parent
->color = RB_Red;

                RBTree_right_rotate(tree, parent);

                brother 
= node->parent->leftChild;
            }


            
// case 2: 兄弟節(jié)點(diǎn)的兩孩子均為黑色
            if (brother->leftChild->color == RB_Black
                
&& brother->rightChild->color == RB_Black) {
                    brother
->color = RB_Red;
                    node 
= parent;
            }


            
else {
                
// case 3: 兄弟節(jié)點(diǎn)的左孩子為紅色,右孩子為黑色
                if (brother->rightChild->color == RB_Black) {
                    brother
->leftChild->color = RB_Black;
                    brother
->color = RB_Red;

                    RBTree_left_rotate(tree, brother);

                    brother 
= node->parent->rightChild;
                }


                
// case 4:兄弟節(jié)點(diǎn)的右孩子為紅色
                brother->color = parent->color;
                parent
->color = RB_Black;
                brother
->leftChild->color = RB_Black;

                RBTree_right_rotate(tree, parent);

                node 
= *tree;
            }

        }

    }


    node
->color = RB_Black;
}


// 刪除
RBNode* RBTree_delete(RBTree* tree, RBNode* node)
{
    RBNode
* successor = NULL;
    RBNode
* temp = NULL;

    
if (node->leftChild == &RBNode_Nil || node->rightChild == &RBNode_Nil) {
        successor 
= node;
    }

    
else {
        successor 
= RBTree_successor(node);
    }


    
if (successor->leftChild != &RBNode_Nil) {
        temp 
= successor->leftChild;
    }

    
else {
        temp 
= successor->rightChild;
    }


    temp
->parent = successor->parent;

    
if (successor->parent == &RBNode_Nil) {
        
*tree = temp;
    }

    
else {
        
if (successor == successor->parent->leftChild) {
            successor
->parent->leftChild = temp;
        }

        
else {
            successor
->parent->rightChild = temp;
        }

    }


    
if (successor != node) {
        node
->key = successor->key;
    }


    
if (successor->color == RB_Black) {
        RBTree_delete_fixup(tree, temp);
    }


    
return successor;
}

測(cè)試代碼,測(cè)試數(shù)組中的數(shù)字與測(cè)試步驟是經(jīng)過(guò)仔細(xì)挑選的,以確保各個(gè)分支都可以測(cè)試到:

void test_redblacktree_delete(RBTree* tree, int key)
{
    RBNode
* node = RBTree_search(*tree, key);
    assert(node 
!= RBTree_nil());

    printf(
"\n刪除節(jié)點(diǎn) %d \n", node->key);
    
    node 
= RBTree_delete(tree, node);
    free(node);
    
    RBTree_print(
*tree);
}


void test_redblacktree()
{
    
const int length = 14;
    
int array[length] = {
        
2346711918121419172220
    }
;

    
int i;
    RBTree tree 
= RBTree_nil();
    RBNode
* node = NULL;

    
// 插入節(jié)點(diǎn)生成樹(shù)
    for (i = 0; i < length; i++{
        node 
= (RBNode*)malloc(sizeof(RBNode));
        node
->key = array[i];
        node
->color = RB_Red;
        node
->parent = RBTree_nil();
        node
->leftChild = RBTree_nil();
        node
->rightChild = RBTree_nil();

        RBTree_insert(
&tree, node);    
    }


    RBTree_print(tree);

    
// 插入測(cè)試
    node = (RBNode*)malloc(sizeof(RBNode));
    node
->key = 21;

    printf(
"\n插入節(jié)點(diǎn) %d\n", node->key);

    RBTree_insert(
&tree, node);
    RBTree_print(tree);

    
// 查找測(cè)試
    i = 6;
    node 
= RBTree_search(tree, i);

    
if (node != RBTree_nil()) {
        printf(
"\n在紅黑樹(shù)中找到節(jié)點(diǎn) %d\n", node->key);
    }

    
else {
        printf(
"\n在紅黑樹(shù)中找不到節(jié)點(diǎn) %d\n", i);
    }


    
// 刪除測(cè)試
    
// 
    i = 4;// 取值 1, 2, 3, 4,分別對(duì)應(yīng) case 1, 2, 3, 4

    
switch (i)
    
{
    
case 1:    // 兄弟為紅色
        test_redblacktree_delete(&tree, 3);
        
break;

    
case 2:    // 兄弟為黑色,且兄弟的兩孩子均為黑色
        test_redblacktree_delete(&tree, 12);
        
break;

    
case 3:    // 兄弟為黑色,且兄弟的左孩子為紅色,右孩子均為黑色
        test_redblacktree_delete(&tree, 19);
        
break;

    
case 4:    // 兄弟為黑色,且兄弟的右孩子為紅色
        test_redblacktree_delete(&tree, 9);
        
break;
    }


    test_redblacktree_delete(
&tree, 21);

    
// 刪除樹(shù)
    for (i = 0; i < length; i++{
        node 
= RBTree_search(tree, array[i]);

        
if (node != RBTree_nil()) {
            printf(
"刪除 %d\n", node->key);
            node 
= RBTree_delete(&tree, node);
            free(node);
        }

    }


    assert(tree 
== RBTree_nil());
}


測(cè)試結(jié)果
===============================================
創(chuàng)建紅黑樹(shù)
-------------------------------
 第 1 層, 6(B)
  第 2 層, 3(B)
   第 3 層, 2(B)
   第 3 層, 4(B)
  第 2 層, 12(B)
   第 3 層, 9(R)
    第 4 層, 7(B)
    第 4 層, 11(B)
   第 3 層, 18(R)
    第 4 層, 14(B)
     第 5 層, 17(R)
    第 4 層, 20(B)
     第 5 層, 19(R)
     第 5 層, 22(R)

插入節(jié)點(diǎn) 21
-------------------------------
 第 1 層, 6(B)
  第 2 層, 3(B)
   第 3 層, 2(B)
   第 3 層, 4(B)
  第 2 層, 12(R)
   第 3 層, 9(B)
    第 4 層, 7(B)
    第 4 層, 11(B)
   第 3 層, 18(B)
    第 4 層, 14(B)
     第 5 層, 17(R)
    第 4 層, 20(R)
     第 5 層, 19(B)
     第 5 層, 22(B)
      第 6 層, 21(R)

在紅黑樹(shù)中找到節(jié)點(diǎn) 6
-------------------------------

刪除節(jié)點(diǎn) 9
-------------------------------
 第 1 層, 6(B)
  第 2 層, 3(B)
   第 3 層, 2(B)
   第 3 層, 4(B)
  第 2 層, 18(R)
   第 3 層, 12(B)
    第 4 層, 11(B)
     第 5 層, 7(R)
    第 4 層, 14(B)
     第 5 層, 17(R)
   第 3 層, 20(B)
    第 4 層, 19(B)
    第 4 層, 22(B)
     第 5 層, 21(R)

刪除節(jié)點(diǎn) 21
-------------------------------
 第 1 層, 6(B)
  第 2 層, 3(B)
   第 3 層, 2(B)
   第 3 層, 4(B)
  第 2 層, 18(R)
   第 3 層, 12(B)
    第 4 層, 11(B)
     第 5 層, 7(R)
    第 4 層, 14(B)
     第 5 層, 17(R)
   第 3 層, 20(B)
    第 4 層, 19(B)
    第 4 層, 22(B)

刪除 2
刪除 3
刪除 4
刪除 6
刪除 7
刪除 11
刪除 18
刪除 12
刪除 14
刪除 19
刪除 17
刪除 22
刪除 20

測(cè)試結(jié)束




posted on 2011-04-03 11:21 羅朝輝 閱讀(1905) 評(píng)論(0)  編輯 收藏 引用 所屬分類: Algorithms
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美高潮视频| 亚洲免费成人av| 亚洲欧洲精品一区二区| 久久av资源网站| 极品av少妇一区二区| 久久免费黄色| 亚洲美女电影在线| 欧美在线观看视频在线| 一区一区视频| 欧美~级网站不卡| 亚洲性视频h| 国产一区二区看久久| 欧美激情第三页| 亚洲欧美精品伊人久久| 欧美成人精品在线| 亚洲综合色视频| 亚洲国产精品va在线观看黑人| 欧美成人精品在线观看| 亚洲在线免费| 亚洲日本欧美| 久久亚洲春色中文字幕| 亚洲欧美国产精品专区久久| 尤物在线观看一区| 国产乱码精品一区二区三区忘忧草 | 久久久久免费| 国产一区二区丝袜高跟鞋图片 | 亚洲精品小视频| 激情文学综合丁香| 在线看视频不卡| 亚洲精品日本| 亚洲欧美www| 欧美专区日韩视频| 久久综合色一综合色88| 亚洲综合色网站| 国内自拍视频一区二区三区| 欧美日韩国产综合网| 亚洲一区欧美激情| 久久久噜噜噜久久久| 中国女人久久久| 亚洲成色999久久网站| 国产精品色午夜在线观看| 欧美日韩mv| 国产欧美一区二区视频| 国产综合激情| 欧美一区二视频| 欧美激情第9页| 一区二区亚洲欧洲国产日韩| 亚洲综合视频1区| 亚洲另类视频| 欧美第一黄网免费网站| 亚洲国产精品一区二区第一页| 亚洲午夜黄色| 9色精品在线| 欧美日韩国产探花| 99精品视频一区| 亚洲日韩第九十九页| 欧美顶级大胆免费视频| 亚洲精品护士| 亚洲激情第一区| 久久久91精品| **网站欧美大片在线观看| 香蕉久久a毛片| 免费成人毛片| 91久久精品美女| 免费视频亚洲| 亚洲视频一起| 欧美成人午夜激情在线| 蜜桃av综合| 免费永久网站黄欧美| 免费日韩av片| 麻豆av一区二区三区| 亚洲一区二区在线播放| 亚洲一区国产| 久久不射中文字幕| 另类国产ts人妖高潮视频| 久久在精品线影院精品国产| 亚洲欧美久久久| 国产精品一区二区久久国产| 午夜一区在线| 亚洲欧美卡通另类91av| 国产日韩欧美在线一区| 久久国产精品亚洲va麻豆| 欧美视频亚洲视频| 国产一区在线视频| 午夜日韩av| 亚洲天堂网站在线观看视频| 欧美 日韩 国产 一区| 亚洲伦理在线免费看| 欧美一区1区三区3区公司| 日韩视频在线免费| 久久精品国产亚洲一区二区三区| 久色成人在线| 亚洲神马久久| 免费成年人欧美视频| 欧美视频你懂的| 日韩视频在线一区二区三区| 欧美成人自拍| 美女尤物久久精品| 亚洲激情另类| 亚洲国产成人在线| 欧美高清视频一区| 99精品热视频| 亚洲一区二区在线看| 国产精品毛片a∨一区二区三区| 亚洲一区二区高清| 亚洲欧美国产毛片在线| 国产在线不卡| 欧美激情视频网站| 欧美日韩国产精品一区| 午夜精品久久久| 久久综合色天天久久综合图片| 亚洲国产精品国自产拍av秋霞| 91久久久国产精品| 国产精品高潮视频| 久久综合九色综合网站| 欧美调教vk| 午夜综合激情| 欧美jizzhd精品欧美巨大免费| 久久久久免费| 国产欧美日韩在线| 亚洲午夜未删减在线观看| 亚洲最新在线| 国产欧美精品在线观看| 老司机免费视频久久| 欧美精品一区在线发布| 免费一区二区三区| 欧美日韩免费视频| 欧美一区二区女人| 小处雏高清一区二区三区| 国产一区二区三区高清播放| 女人天堂亚洲aⅴ在线观看| 男女av一区三区二区色多| 亚洲人成亚洲人成在线观看| 亚洲国产精品第一区二区三区 | 欧美mv日韩mv亚洲| 欧美伊人久久久久久久久影院 | 欧美日韩一区二区三区视频| 久久久人成影片一区二区三区观看 | 亚洲精品视频在线| 欧美亚洲网站| 欧美在线免费一级片| 欧美日韩日日骚| 亚洲精品国产视频| 亚洲精品中文字幕在线观看| 久久福利影视| 久久九九免费视频| 国产欧美视频一区二区| 一二三区精品福利视频| 夜夜嗨av一区二区三区四季av| 久久久精品五月天| 久久综合五月| 一区二区三区在线高清| 欧美制服丝袜第一页| 久久激情一区| 激情成人亚洲| 久久夜精品va视频免费观看| 免费短视频成人日韩| 影音先锋亚洲视频| 久久综合图片| 亚洲国产精品国自产拍av秋霞| 亚洲日本欧美在线| 欧美日本二区| 亚洲一区三区视频在线观看| 久久www免费人成看片高清| 韩国免费一区| 欧美日产一区二区三区在线观看| 亚洲毛片播放| 久久精品成人欧美大片古装| 在线观看国产成人av片| 欧美大色视频| 亚洲免费视频观看| 欧美成人中文字幕| 中文亚洲欧美| 国产自产精品| 欧美理论电影在线观看| 亚洲欧美春色| 国产一区在线观看视频| 亚洲精品日韩久久| 亚洲高清av| 久久久久久久一区二区| 久久精品日产第一区二区| 国产精品日本欧美一区二区三区| 99re66热这里只有精品4| 一本久道综合久久精品| 欧美激情亚洲自拍| 99精品久久免费看蜜臀剧情介绍| 99精品福利视频| 欧美视频日韩视频| 亚洲午夜久久久久久尤物| 亚欧成人精品| 国产日韩欧美高清| 久久久久一本一区二区青青蜜月| 欧美成人国产va精品日本一级| 亚洲二区在线| 欧美精品亚洲| 在线视频亚洲欧美| 久久久久久亚洲精品中文字幕| 狠狠色噜噜狠狠狠狠色吗综合| 麻豆成人av| 日韩一二三在线视频播|