日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[数据结构]数据结构中各种树

發布時間:2025/3/15 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [数据结构]数据结构中各种树 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

閱讀目錄

  • 1. 二叉樹
  • 2. 二叉查找樹
  • 3. 平衡二叉樹
  • 3.1 平衡查找樹之AVL樹
  • 3.2 平衡二叉樹之紅黑樹
  • 4. B樹
  • 5. B+樹
  • 6. B*樹
  • 7. Trie樹

  數據結構中有很多樹的結構,其中包括二叉樹、二叉搜索樹、2-3樹、紅黑樹等等。本文中對數據結構中常見的幾種樹的概念和用途進行了匯總,不求嚴格精準,但求簡單易懂。

1. 二叉樹

  二叉樹是數據結構中一種重要的數據結構,也是樹表家族最為基礎的結構。

  二叉樹的定義:二叉樹的每個結點至多只有二棵子樹(不存在度大于2的結點),二叉樹的子樹有左右之分,次序不能顛倒。二叉樹的第i層至多有2i-1個結點;深度為k的二叉樹至多有2k-1個結點;對任何一棵二叉樹T,如果其終端結點數為n0,度為2的結點數為n2,則n0=n2+1。

  二叉樹的示例

  滿二叉樹和完全二叉樹:

  滿二叉樹:除最后一層無任何子節點外,每一層上的所有結點都有兩個子結點。也可以這樣理解,除葉子結點外的所有結點均有兩個子結點。節點數達到最大值,所有葉子結點必須在同一層上。

  滿二叉樹的性質:

  1)?一顆樹深度為h,最大層數為k,深度與最大層數相同,k=h;

  2) 葉子數為2h;

  3) 第k層的結點數是:2k-1;

  4) 總結點數是:2k-1,且總節點數一定是奇數。

  完全二叉樹:若設二叉樹的深度為h,除第 h 層外,其它各層 (1~(h-1)層) 的結點數都達到最大個數,第h層所有的結點都連續集中在最左邊,這就是完全二叉樹。

  注:完全二叉樹是效率很高的數據結構,堆是一種完全二叉樹或者近似完全二叉樹,所以效率極高,像十分常用的排序算法、Dijkstra算法、Prim算法等都要用堆才能優化,二叉排序樹的效率也要借助平衡性來提高,而平衡性基于完全二叉樹。

  二叉樹的性質

  1) 在非空二叉樹中,第i層的結點總數不超過2i-1, i>=1;

  2) 深度為h的二叉樹最多有2h-1個結點(h>=1),最少有h個結點;

3) 對于任意一棵二叉樹,如果其葉結點數為N0,而度數為2的結點總數為N2,則N0=N2+1; 4) 具有n個結點的完全二叉樹的深度為log2(n+1); 5)有N個結點的完全二叉樹各結點如果用順序方式存儲,則結點之間有如下關系: 若I為結點編號則 如果I>1,則其父結點的編號為I/2; 如果2I<=N,則其左兒子(即左子樹的根結點)的編號為2I;若2I>N,則無左兒子; 如果2I+1<=N,則其右兒子的結點編號為2I+1;若2I+1>N,則無右兒子。 6)給定N個節點,能構成h(N)種不同的二叉樹,其中h(N)為卡特蘭數的第N項,h(n)=C(2*n, n)/(n+1)。 7)設有i個枝點,I為所有枝點的道路長度總和,J為葉的道路長度總和J=I+2i

2. 二叉查找樹

二叉查找樹定義:又稱為是二叉排序樹(Binary Sort Tree)或二叉搜索樹。二叉排序樹或者是一棵空樹,或者是具有下列性質的二叉樹: 1) 若左子樹不空,則左子樹上所有結點的值均小于它的根結點的值; 2) 若右子樹不空,則右子樹上所有結點的值均大于或等于它的根結點的值; 3) 左、右子樹也分別為二叉排序樹; 4) 沒有鍵值相等的節點。 二叉查找樹的性質:對二叉查找樹進行中序遍歷,即可得到有序的數列。   二叉查找樹的時間復雜度:它和二分查找一樣,插入和查找的時間復雜度均為O(logn),但是在最壞的情況下仍然會有O(n)的時間復雜度。原因在于插入和刪除元素的時候,樹沒有保持平衡(比如,我們查找上圖(b)中的“93”,我們需要進行n次查找操作)。我們追求的是在最壞的情況下仍然有較好的時間復雜度,這就是平衡查找樹設計的初衷。   二叉查找樹的高度決定了二叉查找樹的查找效率。

  二叉查找樹的插入過程如下:

  1) 若當前的二叉查找樹為空,則插入的元素為根節點;

  2) 若插入的元素值小于根節點值,則將元素插入到左子樹中;

  3) 若插入的元素值不小于根節點值,則將元素插入到右子樹中。

  二叉查找樹的刪除,分三種情況進行處理:

  1) p為葉子節點,直接刪除該節點,再修改其父節點的指針(注意分是根節點和不是根節點),如圖a;

  2) p為單支節點(即只有左子樹或右子樹)。讓p的子樹與p的父親節點相連,刪除p即可(注意分是根節點和不是根節點),如圖b;

  3) p的左子樹和右子樹均不空。找到p的后繼y,因為y一定沒有左子樹,所以可以刪除y,并讓y的父親節點成為y的右子樹的父親節點,并用y的值代替p的值;或者方法二是找到p的前驅x,x一定沒有右子樹,所以可以刪除x,并讓x的父親節點成為y的左子樹的父親節點。如圖c。

  二叉樹相關實現源碼:

  插入操作:

struct node {int val;pnode lchild;pnode rchild; };pnode BT = NULL;//遞歸方法插入節點 pnode insert(pnode root, int x) {pnode p = (pnode)malloc(LEN);p->val = x;p->lchild = NULL;p->rchild = NULL;if(root == NULL){root = p; } else if(x < root->val){root->lchild = insert(root->lchild, x); }else{root->rchild = insert(root->rchild, x); }return root; }//非遞歸方法插入節點 void insert_BST(pnode q, int x) {pnode p = (pnode)malloc(LEN);p->val = x;p->lchild = NULL;p->rchild = NULL;if(q == NULL){BT = p;return ; } while(q->lchild != p && q->rchild != p){if(x < q->val){if(q->lchild){q = q->lchild; } else{q->lchild = p;} } else{if(q->rchild){q = q->rchild; } else{q->rchild = p; }}}return; }

?

?

  刪除操作:

bool delete_BST(pnode p, int x) //返回一個標志,表示是否找到被刪元素 {bool find = false;pnode q;p = BT;while(p && !find){ //尋找被刪元素 if(x == p->val){ //找到被刪元素 find = true; } else if(x < p->val){ //沿左子樹找 q = p;p = p->lchild; }else{ //沿右子樹找 q = p;p = p->rchild; }}if(p == NULL){ //沒找到 cout << "沒有找到" << x << endl; }if(p->lchild == NULL && p->rchild == NULL){ //p為葉子節點 if(p == BT){ //p為根節點 BT = NULL; }else if(q->lchild == p){ q->lchild = NULL;} else{q->rchild = NULL; }free(p); //釋放節點p }else if(p->lchild == NULL || p->rchild == NULL){ //p為單支子樹 if(p == BT){ //p為根節點 if(p->lchild == NULL){BT = p->rchild; } else{BT = p->lchild; }} else{if(q->lchild == p && p->lchild){ //p是q的左子樹且p有左子樹 q->lchild = p->lchild; //將p的左子樹鏈接到q的左指針上 } else if(q->lchild == p && p->rchild){q->lchild = p->rchild; }else if(q->rchild == p && p->lchild){q->rchild = p->lchild; }else{q->rchild = p->rchild;}}free(p);}else{ //p的左右子樹均不為空 pnode t = p;pnode s = p->lchild; //從p的左子節點開始 while(s->rchild){ //找到p的前驅,即p左子樹中值最大的節點 t = s; s = s->rchild; }p->val = s->val; //把節點s的值賦給p if(t == p){p->lchild = s->lchild; } else{t->rchild = s->lchild; }free(s); }return find; }

?

  查找操作:

pnode search_BST(pnode p, int x) {bool solve = false;while(p && !solve){if(x == p->val){solve = true; } else if(x < p->val){p = p->lchild; }else{p = p->rchild; }}if(p == NULL){cout << "沒有找到" << x << endl; } return p; }

3. 平衡二叉樹

  我們知道,對于一般的二叉搜索樹(Binary Search Tree),其期望高度(即為一棵平衡樹時)為log2n,其各操作的時間復雜度O(log2n)同時也由此而決定。但是,在某些極端的情況下(如在插入的序列是有序的時),二叉搜索樹將退化成近似鏈或鏈,此時,其操作的時間復雜度將退化成線性的,即O(n)。我們可以通過隨機化建立二叉搜索樹來盡量的避免這種情況,但是在進行了多次的操作之后,由于在刪除時,我們總是選擇將待刪除節點的后繼代替它本身,這樣就會造成總是右邊的節點數目減少,以至于樹向左偏沉。這同時也會造成樹的平衡性受到破壞,提高它的操作的時間復雜度。于是就有了我們下邊介紹的平衡二叉樹。

  平衡二叉樹定義:平衡二叉樹(Balanced Binary Tree)又被稱為AVL樹(有別于AVL算法),且具有以下性質:它是一 棵空樹或它的左右兩個子樹的高度差的絕對值不超過1,并且左右兩個子樹都是一棵平衡二叉樹。平衡二叉樹的常用算法有紅黑樹、AVL樹等。在平衡二叉搜索樹中,我們可以看到,其高度一般都良好地維持在O(log2n),大大降低了操作的時間復雜度。

  最小二叉平衡樹的節點的公式如下:

  F(n)=F(n-1)+F(n-2)+1

  這個類似于一個遞歸的數列,可以參考Fibonacci數列,1是根節點,F(n-1)是左子樹的節點數量,F(n-2)是右子樹的節點數量。


3.1 平衡查找樹之AVL樹

  有關AVL樹的具體實現,可以參考C小加的博客《一步一步寫平衡二叉樹(AVL)》。

  AVL樹定義:AVL樹是最先發明的自平衡二叉查找樹。AVL樹得名于它的發明者 G.M. Adelson-Velsky 和 E.M. Landis,他們在 1962 年的論文 "An algorithm for the organization of information" 中發表了它。在AVL中任何節點的兩個兒子子樹的高度最大差別為1,所以它也被稱為高度平衡樹,n個結點的AVL樹最大深度約1.44log2n。查找、插入和刪除在平均和最壞情況下都是O(logn)。增加和刪除可能需要通過一次或多次樹旋轉來重新平衡這個樹。這個方案很好的解決了二叉查找樹退化成鏈表的問題,把插入,查找,刪除的時間復雜度最好情況和最壞情況都維持在O(logN)。但是頻繁旋轉會使插入和刪除犧牲掉O(logN)左右的時間,不過相對二叉查找樹來說,時間上穩定了很多。

  AVL樹的自平衡操作——旋轉:

  AVL樹最關鍵的也是最難的一步操作就是旋轉。旋轉主要是為了實現AVL樹在實施了插入和刪除操作以后,樹重新回到平衡的方法。下面我們重點研究一下AVL樹的旋轉。

  對于一個平衡的節點,由于任意節點最多有兩個兒子,因此高度不平衡時,此節點的兩顆子樹的高度差2.容易看出,這種不平衡出現在下面四種情況:

  1) 6節點的左子樹3節點高度比右子樹7節點大2,左子樹3節點的左子樹1節點高度大于右子樹4節點,這種情況成為左左。

  2) 6節點的左子樹2節點高度比右子樹7節點大2,左子樹2節點的左子樹1節點高度小于右子樹4節點,這種情況成為左右。

  3) 2節點的左子樹1節點高度比右子樹5節點小2,右子樹5節點的左子樹3節點高度大于右子樹6節點,這種情況成為右左。

  4) 2節點的左子樹1節點高度比右子樹4節點小2,右子樹4節點的左子樹3節點高度小于右子樹6節點,這種情況成為右右。

  從圖2中可以可以看出,1和4兩種情況是對稱的,這兩種情況的旋轉算法是一致的,只需要經過一次旋轉就可以達到目標,我們稱之為單旋轉。2和3兩種情況也是對稱的,這兩種情況的旋轉算法也是一致的,需要進行兩次旋轉,我們稱之為雙旋轉。

  單旋轉

  單旋轉是針對于左左和右右這兩種情況的解決方案,這兩種情況是對稱的,只要解決了左左這種情況,右右就很好辦了。圖3是左左情況的解決方案,節點k2不滿足平衡特性,因為它的左子樹k1比右子樹Z深2層,而且k1子樹中,更深的一層的是k1的左子樹X子樹,所以屬于左左情況。

  為使樹恢復平衡,我們把k2變成這棵樹的根節點,因為k2大于k1,把k2置于k1的右子樹上,而原本在k1右子樹的Y大于k1,小于k2,就把Y置于k2的左子樹上,這樣既滿足了二叉查找樹的性質,又滿足了平衡二叉樹的性質。

  這樣的操作只需要一部分指針改變,結果我們得到另外一顆二叉查找樹,它是一棵AVL樹,因為X向上一移動了一層,Y還停留在原來的層面上,Z向下移動了一層。整棵樹的新高度和之前沒有在左子樹上插入的高度相同,插入操作使得X高度長高了。因此,由于這顆子樹高度沒有變化,所以通往根節點的路徑就不需要繼續旋轉了。

  雙旋轉

  對于左右和右左這兩種情況,單旋轉不能使它達到一個平衡狀態,要經過兩次旋轉。雙旋轉是針對于這兩種情況的解決方案,同樣的,這樣兩種情況也是對稱的,只要解決了左右這種情況,右左就很好辦了。圖4是左右情況的解決方案,節點k3不滿足平衡特性,因為它的左子樹k1比右子樹Z深2層,而且k1子樹中,更深的一層的是k1的右子樹k2子樹,所以屬于左右情況。

?

?

?  為使樹恢復平衡,我們需要進行兩步,第一步,把k1作為根,進行一次右右旋轉,旋轉之后就變成了左左情況,所以第二步再進行一次左左旋轉,最后得到了一棵以k2為根的平衡二叉樹。

  AVL樹實現源碼:

//AVL樹節點信息 template<class T> class TreeNode {public:TreeNode():lson(NULL),rson(NULL),freq(1),hgt(0){}T data;//int hgt;//高度unsigned int freq;//頻率TreeNode* lson;//指向左兒子的地址TreeNode* rson;//指向右兒子的地址 }; //AVL樹類的屬性和方法聲明 template<class T> class AVLTree {private:TreeNode<T>* root;//根節點void insertpri(TreeNode<T>* &node,T x);//插入TreeNode<T>* findpri(TreeNode<T>* node,T x);//查找void insubtree(TreeNode<T>* node);//中序遍歷void Deletepri(TreeNode<T>* &node,T x);//刪除int height(TreeNode<T>* node);//求樹的高度void SingRotateLeft(TreeNode<T>* &k2);//左左情況下的旋轉void SingRotateRight(TreeNode<T>* &k2);//右右情況下的旋轉void DoubleRotateLR(TreeNode<T>* &k3);//左右情況下的旋轉void DoubleRotateRL(TreeNode<T>* &k3);//右左情況下的旋轉int Max(int cmpa,int cmpb);//求最大值public:AVLTree():root(NULL){}void insert(T x);//插入接口TreeNode<T>* find(T x);//查找接口void Delete(T x);//刪除接口void traversal();//遍歷接口 }; //計算節點的高度 template<class T> int AVLTree<T>::height(TreeNode<T>* node) {if(node!=NULL)return node->hgt;return -1; } //求最大值 template<class T> int AVLTree<T>::Max(int cmpa,int cmpb) {return cmpa>cmpb?cmpa:cmpb; } //左左情況下的旋轉 template<class T> void AVLTree<T>::SingRotateLeft(TreeNode<T>* &k2) {TreeNode<T>* k1;k1=k2->lson;k2->lson=k1->rson;k1->rson=k2;k2->hgt=Max(height(k2->lson),height(k2->rson))+1;k1->hgt=Max(height(k1->lson),k2->hgt)+1; } //右右情況下的旋轉 template<class T> void AVLTree<T>::SingRotateRight(TreeNode<T>* &k2) {TreeNode<T>* k1;k1=k2->rson;k2->rson=k1->lson;k1->lson=k2;k2->hgt=Max(height(k2->lson),height(k2->rson))+1;k1->hgt=Max(height(k1->rson),k2->hgt)+1; } //左右情況的旋轉 template<class T> void AVLTree<T>::DoubleRotateLR(TreeNode<T>* &k3) {SingRotateRight(k3->lson);SingRotateLeft(k3); } //右左情況的旋轉 template<class T> void AVLTree<T>::DoubleRotateRL(TreeNode<T>* &k3) {SingRotateLeft(k3->rson);SingRotateRight(k3); } //插入 template<class T> void AVLTree<T>::insertpri(TreeNode<T>* &node,T x) {if(node==NULL)//如果節點為空,就在此節點處加入x信息 {node=new TreeNode<T>();node->data=x;return;}if(node->data>x)//如果x小于節點的值,就繼續在節點的左子樹中插入x {insertpri(node->lson,x);if(2==height(node->lson)-height(node->rson))if(x<node->lson->data)SingRotateLeft(node);elseDoubleRotateLR(node);}else if(node->data<x)//如果x大于節點的值,就繼續在節點的右子樹中插入x {insertpri(node->rson,x);if(2==height(node->rson)-height(node->lson))//如果高度之差為2的話就失去了平衡,需要旋轉if(x>node->rson->data)SingRotateRight(node);elseDoubleRotateRL(node);}else ++(node->freq);//如果相等,就把頻率加1node->hgt=Max(height(node->lson),height(node->rson)); } //插入接口 template<class T> void AVLTree<T>::insert(T x) {insertpri(root,x); } //查找 template<class T> TreeNode<T>* AVLTree<T>::findpri(TreeNode<T>* node,T x) {if(node==NULL)//如果節點為空說明沒找到,返回NULL {return NULL;}if(node->data>x)//如果x小于節點的值,就繼續在節點的左子樹中查找x {return findpri(node->lson,x);}else if(node->data<x)//如果x大于節點的值,就繼續在節點的左子樹中查找x {return findpri(node->rson,x);}else return node;//如果相等,就找到了此節點 } //查找接口 template<class T> TreeNode<T>* AVLTree<T>::find(T x) {return findpri(root,x); } //刪除 template<class T> void AVLTree<T>::Deletepri(TreeNode<T>* &node,T x) {if(node==NULL) return ;//沒有找到值是x的節點if(x < node->data){Deletepri(node->lson,x);//如果x小于節點的值,就繼續在節點的左子樹中刪除xif(2==height(node->rson)-height(node->lson))if(node->rson->lson!=NULL&&(height(node->rson->lson)>height(node->rson->rson)) )DoubleRotateRL(node);elseSingRotateRight(node);}else if(x > node->data){Deletepri(node->rson,x);//如果x大于節點的值,就繼續在節點的右子樹中刪除xif(2==height(node->lson)-height(node->rson))if(node->lson->rson!=NULL&& (height(node->lson->rson)>height(node->lson->lson) ))DoubleRotateLR(node);elseSingRotateLeft(node);}else//如果相等,此節點就是要刪除的節點 {if(node->lson&&node->rson)//此節點有兩個兒子 {TreeNode<T>* temp=node->rson;//temp指向節點的右兒子while(temp->lson!=NULL) temp=temp->lson;//找到右子樹中值最小的節點//把右子樹中最小節點的值賦值給本節點node->data=temp->data;node->freq=temp->freq;Deletepri(node->rson,temp->data);//刪除右子樹中最小值的節點if(2==height(node->lson)-height(node->rson)){if(node->lson->rson!=NULL&& (height(node->lson->rson)>height(node->lson->lson) ))DoubleRotateLR(node);elseSingRotateLeft(node);}}else//此節點有1個或0個兒子 {TreeNode<T>* temp=node;if(node->lson==NULL)//有右兒子或者沒有兒子node=node->rson;else if(node->rson==NULL)//有左兒子node=node->lson;delete(temp);temp=NULL;}}if(node==NULL) return;node->hgt=Max(height(node->lson),height(node->rson))+1;return; } //刪除接口 template<class T> void AVLTree<T>::Delete(T x) {Deletepri(root,x); } //中序遍歷函數 template<class T> void AVLTree<T>::insubtree(TreeNode<T>* node) {if(node==NULL) return;insubtree(node->lson);//先遍歷左子樹cout<<node->data<<" ";//輸出根節點insubtree(node->rson);//再遍歷右子樹 } //中序遍歷接口 template<class T> void AVLTree<T>::traversal() {insubtree(root); }

?


3.2 平衡二叉樹之紅黑樹

  紅黑樹的定義:紅黑樹是一種自平衡二叉查找樹,是在計算機科學中用到的一種數據結構,典型的用途是實現關聯數組。它是在1972年由魯道夫·貝爾發明的,稱之為"對稱二叉B樹",它現代的名字是在 Leo J. Guibas 和?Robert Sedgewick?于1978年寫的一篇論文中獲得的。它是復雜的,但它的操作有著良好的最壞情況運行時間,并且在實踐中是高效的: 它可以在O(logn)時間內做查找,插入和刪除,這里的n是樹中元素的數目。

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

  紅黑樹的性質:

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

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

  性質2. 根是黑色。

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

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

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

  下面是一個具體的紅黑樹的圖例:

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

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

  以下內容整理自wiki百科之紅黑樹。

  紅黑樹的自平衡操作:

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

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

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

  插入操作:

  假設,將要插入的節點標為N,N的父節點標為P,N的祖父節點標為G,N的叔父節點標為U。在圖中展示的任何顏色要么是由它所處情形這些所作的假定,要么是假定所暗含的。

  情形1:?該樹為空樹,直接插入根結點的位置,違反性質1,把節點顏色有紅改為黑即可。

  情形2:?插入節點N的父節點P為黑色,不違反任何性質,無需做任何修改。在這種情形下,樹仍是有效的。性質5也未受到威脅,盡管新節點N有兩個黑色葉子子節點;但由于新節點N是紅色,通過它的每個子節點的路徑就都有同通過它所取代的黑色的葉子的路徑同樣數目的黑色節點,所以依然滿足這個性質。

  注:?情形1很簡單,情形2中P為黑色,一切安然無事,但P為紅就不一樣了,下邊是P為紅的各種情況,也是真正難懂的地方。

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

?

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

  情形5:?父節點P是紅色而叔父節點U是黑色或缺少,并且新節點N是其父節點P的右子節點而父節點P又是其父節點的左子節點。在這種情形下,我們進行一次左旋轉調換新節點和其父節點的角色; 接著,我們按情形4處理以前的父節點P以解決仍然失效的性質4。注意這個改變會導致某些路徑通過它們以前不通過的新節點N(比如圖中1號葉子節點)或不通過節點P(比如圖中3號葉子節點),但由于這兩個節點都是紅色的,所以性質5仍有效。

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

  刪除操作:

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

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

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

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

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

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

  情形2:?S是紅色。在這種情形下我們在N的父親上做左旋轉,把紅色兄弟轉換成N的祖父,我們接著對調N的父親和祖父的顏色。完成這兩個操作后,盡管所有路徑上黑色節點的數目沒有改變,但現在N有了一個黑色的兄弟和一個紅色的父親(它的新兄弟是黑色因為它是紅色S的一個兒子),所以我們可以接下去按情形4情形5情形6來處理。

?

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

?

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

?

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

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

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

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

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

?

  紅黑樹實現源碼:

#define BLACK 1 #define RED 0using namespace std;class bst { private:struct Node {int value;bool color;Node *leftTree, *rightTree, *parent;Node() {color = RED;leftTree = NULL;rightTree = NULL;parent = NULL;value = 0;}Node* grandparent() {if (parent == NULL) {return NULL;}return parent->parent;}Node* uncle() {if (grandparent() == NULL) {return NULL;}if (parent == grandparent()->rightTree)return grandparent()->leftTree;elsereturn grandparent()->rightTree;}Node* sibling() {if (parent->leftTree == this)return parent->rightTree;elsereturn parent->leftTree;}};void rotate_right(Node *p) {Node *gp = p->grandparent();Node *fa = p->parent;Node *y = p->rightTree;fa->leftTree = y;if (y != NIL)y->parent = fa;p->rightTree = fa;fa->parent = p;if (root == fa)root = p;p->parent = gp;if (gp != NULL) {if (gp->leftTree == fa)gp->leftTree = p;elsegp->rightTree = p;}}void rotate_left(Node *p) {if (p->parent == NULL) {root = p;return;}Node *gp = p->grandparent();Node *fa = p->parent;Node *y = p->leftTree;fa->rightTree = y;if (y != NIL)y->parent = fa;p->leftTree = fa;fa->parent = p;if (root == fa)root = p;p->parent = gp;if (gp != NULL) {if (gp->leftTree == fa)gp->leftTree = p;elsegp->rightTree = p;}}void inorder(Node *p) {if (p == NIL)return;if (p->leftTree)inorder(p->leftTree);cout << p->value << " ";if (p->rightTree)inorder(p->rightTree);}string outputColor(bool color) {return color ? "BLACK" : "RED";}Node* getSmallestChild(Node *p) {if (p->leftTree == NIL)return p;return getSmallestChild(p->leftTree);}bool delete_child(Node *p, int data) {if (p->value > data) {if (p->leftTree == NIL) {return false;}return delete_child(p->leftTree, data);} else if (p->value < data) {if (p->rightTree == NIL) {return false;}return delete_child(p->rightTree, data);} else if (p->value == data) {if (p->rightTree == NIL) {delete_one_child(p);return true;}Node *smallest = getSmallestChild(p->rightTree);swap(p->value, smallest->value);delete_one_child(smallest);return true;}}void delete_one_child(Node *p) {Node *child = p->leftTree == NIL ? p->rightTree : p->leftTree;if (p->parent == NULL && p->leftTree == NIL && p->rightTree == NIL) {p = NULL;root = p;return;}if (p->parent == NULL) {delete p;child->parent = NULL;root = child;root->color = BLACK;return;}if (p->parent->leftTree == p) {p->parent->leftTree = child;} else {p->parent->rightTree = child;}child->parent = p->parent;if (p->color == BLACK) {if (child->color == RED) {child->color = BLACK;} elsedelete_case(child);}delete p;}void delete_case(Node *p) {if (p->parent == NULL) {p->color = BLACK;return;}if (p->sibling()->color == RED) {p->parent->color = RED;p->sibling()->color = BLACK;if (p == p->parent->leftTree)rotate_left(p->sibling());elserotate_right(p->sibling());}if (p->parent->color == BLACK && p->sibling()->color == BLACK&& p->sibling()->leftTree->color == BLACK && p->sibling()->rightTree->color == BLACK) {p->sibling()->color = RED;delete_case(p->parent);} else if (p->parent->color == RED && p->sibling()->color == BLACK&& p->sibling()->leftTree->color == BLACK && p->sibling()->rightTree->color == BLACK) {p->sibling()->color = RED;p->parent->color = BLACK;} else {if (p->sibling()->color == BLACK) {if (p == p->parent->leftTree && p->sibling()->leftTree->color == RED&& p->sibling()->rightTree->color == BLACK) {p->sibling()->color = RED;p->sibling()->leftTree->color = BLACK;rotate_right(p->sibling()->leftTree);} else if (p == p->parent->rightTree && p->sibling()->leftTree->color == BLACK&& p->sibling()->rightTree->color == RED) {p->sibling()->color = RED;p->sibling()->rightTree->color = BLACK;rotate_left(p->sibling()->rightTree);}}p->sibling()->color = p->parent->color;p->parent->color = BLACK;if (p == p->parent->leftTree) {p->sibling()->rightTree->color = BLACK;rotate_left(p->sibling());} else {p->sibling()->leftTree->color = BLACK;rotate_right(p->sibling());}}}void insert(Node *p, int data) {if (p->value >= data) {if (p->leftTree != NIL)insert(p->leftTree, data);else {Node *tmp = new Node();tmp->value = data;tmp->leftTree = tmp->rightTree = NIL;tmp->parent = p;p->leftTree = tmp;insert_case(tmp);}} else {if (p->rightTree != NIL)insert(p->rightTree, data);else {Node *tmp = new Node();tmp->value = data;tmp->leftTree = tmp->rightTree = NIL;tmp->parent = p;p->rightTree = tmp;insert_case(tmp);}}}void insert_case(Node *p) {if (p->parent == NULL) {root = p;p->color = BLACK;return;}if (p->parent->color == RED) {if (p->uncle()->color == RED) {p->parent->color = p->uncle()->color = BLACK;p->grandparent()->color = RED;insert_case(p->grandparent());} else {if (p->parent->rightTree == p && p->grandparent()->leftTree == p->parent) {rotate_left(p);rotate_right(p);p->color = BLACK;p->leftTree->color = p->rightTree->color = RED;} else if (p->parent->leftTree == p && p->grandparent()->rightTree == p->parent) {rotate_right(p);rotate_left(p);p->color = BLACK;p->leftTree->color = p->rightTree->color = RED;} else if (p->parent->leftTree == p && p->grandparent()->leftTree == p->parent) {p->parent->color = BLACK;p->grandparent()->color = RED;rotate_right(p->parent);} else if (p->parent->rightTree == p && p->grandparent()->rightTree == p->parent) {p->parent->color = BLACK;p->grandparent()->color = RED;rotate_left(p->parent);}}}}void DeleteTree(Node *p) {if (!p || p == NIL) {return;}DeleteTree(p->leftTree);DeleteTree(p->rightTree);delete p;} public:bst() {NIL = new Node();NIL->color = BLACK;root = NULL;}~bst() {if (root)DeleteTree(root);delete NIL;}void inorder() {if (root == NULL)return;inorder(root);cout << endl;}void insert(int x) {if (root == NULL) {root = new Node();root->color = BLACK;root->leftTree = root->rightTree = NIL;root->value = x;} else {insert(root, x);}}bool delete_value(int data) {return delete_child(root, data);} private:Node *root, *NIL; };

?

4. B樹

  B樹也是一種用于查找的平衡樹,但是它不是二叉樹。

  B樹的定義:B樹(B-tree)是一種樹狀數據結構,能夠用來存儲排序后的數據。這種數據結構能夠讓查找數據、循序存取、插入數據及刪除的動作,都在對數時間內完成。B樹,概括來說是一個一般化的二叉查找樹,可以擁有多于2個子節點。與自平衡二叉查找樹不同,B-樹為系統最優化大塊數據的讀和寫操作。B-tree算法減少定位記錄時所經歷的中間過程,從而加快存取速度。這種數據結構常被應用在數據庫和文件系統的實作上。

  在B樹中查找給定關鍵字的方法是,首先把根結點取來,在根結點所包含的關鍵字K1,…,Kn查找給定的關鍵字(可用順序查找或二分查找法),若找到等于給定值的關鍵字,則查找成功;否則,一定可以確定要查找的關鍵字在Ki與Ki+1之間,Pi為指向子樹根節點的指針,此時取指針Pi所指的結點繼續查找,直至找到,或指針Pi為空時查找失敗。

  B樹作為一種多路搜索樹(并不是二叉的):

  1) 定義任意非葉子結點最多只有M個兒子;且M>2;

  2)?根結點的兒子數為[2, M];

  3)?除根結點以外的非葉子結點的兒子數為[M/2, M];

  4)?每個結點存放至少M/2-1(取上整)和至多M-1個關鍵字;(至少2個關鍵字)

  5)?非葉子結點的關鍵字個數=指向兒子的指針個數-1;

  6)?非葉子結點的關鍵字:K[1], K[2], …, K[M-1];且K[i] < K[i+1];

  7)?非葉子結點的指針:P[1], P[2], …, P[M];其中P[1]指向關鍵字小于K[1]的子樹,P[M]指向關鍵字大于K[M-1]的子樹,其它P[i]指向關鍵字屬于(K[i-1], K[i])的子樹;

  8)?所有葉子結點位于同一層;

???????如下圖為一個M=3的B樹示例:

  B樹創建的示意圖:

5. B+樹

  B+樹是B樹的變體,也是一種多路搜索樹:

  1) 其定義基本與B-樹相同,除了:

  2) 非葉子結點的子樹指針與關鍵字個數相同;

  3) 非葉子結點的子樹指針P[i],指向關鍵字值屬于[K[i], K[i+1])的子樹(B-樹是開區間);

  4) 為所有葉子結點增加一個鏈指針;

  5) 所有關鍵字都在葉子結點出現;

  下圖為M=3的B+樹的示意圖:

  B+樹的搜索與B樹也基本相同,區別是B+樹只有達到葉子結點才命中(B樹可以在非葉子結點命中),其性能也等價于在關鍵字全集做一次二分查找;

  B+的性質:

  1.所有關鍵字都出現在葉子結點的鏈表中(稠密索引),且鏈表中的關鍵字恰好是有序的;

  2.不可能在非葉子結點命中;

  3.非葉子結點相當于是葉子結點的索引(稀疏索引),葉子結點相當于是存儲(關鍵字)數據的數據層;

  4.更適合文件索引系統。

  下面為一個B+樹創建的示意圖:

6. B*樹

  B*樹是B+樹的變體,在B+樹的非根和非葉子結點再增加指向兄弟的指針,將結點的最低利用率從1/2提高到2/3。

  B*樹如下圖所示:

  B*樹定義了非葉子結點關鍵字個數至少為(2/3)*M,即塊的最低使用率為2/3(代替B+樹的1/2);

  B+樹的分裂:當一個結點滿時,分配一個新的結點,并將原結點中1/2的數據復制到新結點,最后在父結點中增加新結點的指針;B+樹的分裂只影響原結點和父結點,而不會影響兄弟結點,所以它不需要指向兄弟的指針;

  B*樹的分裂:當一個結點滿時,如果它的下一個兄弟結點未滿,那么將一部分數據移到兄弟結點中,再在原結點插入關鍵字,最后修改父結點中兄弟結點的關鍵字(因為兄弟結點的關鍵字范圍改變了);如果兄弟也滿了,則在原結點與兄弟結點之間增加新結點,并各復制1/3的數據到新結點,最后在父結點增加新結點的指針;

  所以,B*樹分配新結點的概率比B+樹要低,空間使用率更高。

7. Trie樹

  Tire樹稱為字典樹,又稱單詞查找樹,Trie樹,是一種樹形結構,是一種哈希樹的變種。典型應用是用于統計,排序和保存大量的字符串(但不僅限于字符串),所以經常被搜索引擎系統用于文本詞頻統計。它的優點是:利用字符串的公共前綴來減少查詢時間,最大限度地減少無謂的字符串比較,查詢效率比哈希樹高。 

Tire樹的三個基本性質: 1)?根節點不包含字符,除根節點外每一個節點都只包含一個字符; 2) 從根節點到某一節點,路徑上經過的字符連接起來,為該節點對應的字符串; 3) 每個節點的所有子節點包含的字符都不相同。

  Tire樹的應用:

  1)?串的快速檢索

  給出N個單詞組成的熟詞表,以及一篇全用小寫英文書寫的文章,請你按最早出現的順序寫出所有不在熟詞表中的生詞。

在這道題中,我們可以用數組枚舉,用哈希,用字典樹,先把熟詞建一棵樹,然后讀入文章進行比較,這種方法效率是比較高的。

  2)?“串”排序

  給定N個互不相同的僅由一個單詞構成的英文名,讓你將他們按字典序從小到大輸出。用字典樹進行排序,采用數組的方式創建字典樹,這棵樹的每個結點的所有兒子很顯然地按照其字母大小排序。對這棵樹進行先序遍歷即可。

  3) 最長公共前綴

  對所有串建立字典樹,對于兩個串的最長公共前綴的長度即他們所在的結點的公共祖先個數,于是,問題就轉化為求公共祖先的問題。

?

----------------

作者:Poll的筆記?
博客出處:http://www.cnblogs.com/maybe2030/?
本文版權歸作者和博客園所有,歡迎轉載,轉載請標明出處。?

?

?

轉載于:https://www.cnblogs.com/-oreo/articles/9952910.html

總結

以上是生活随笔為你收集整理的[数据结构]数据结构中各种树的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

视频在线精品 | av在线播放一区二区三区 | 99视频在线免费观看 | 亚洲欧美日韩中文在线 | 91女人18片女毛片60分钟 | 在线观看免费一级片 | 国产精品ssss在线亚洲 | 91精品一区二区三区久久久久久 | 中文av影院| 丝袜av一区 | 在线免费日韩 | 欧美一区二区在线刺激视频 | 日韩大片在线免费观看 | 国产精品免费高清 | 久久国产精品久久久久 | 精品日韩中文字幕 | 91资源在线 | 日韩在线一区二区免费 | 成人午夜电影网 | 精品一二| 国产色秀视频 | 国产一区 在线播放 | 国产精品福利无圣光在线一区 | 激情在线免费视频 | 久爱综合 | 99热超碰| 99视频精品 | 成 人 黄 色 片 在线播放 | 精品久久久精品 | 丁香婷婷网 | 丝袜一区在线 | 一级做a视频 | 日本精油按摩3 | 亚洲综合视频在线观看 | 亚洲天堂精品视频在线观看 | 久久精品人人做人人综合老师 | 国产精品麻豆免费版 | 免费v片 | 成人av播放| 日韩av在线看 | 日韩理论电影在线 | 天天操夜夜操 | 综合天天网 | av不卡免费看 | 久久99精品久久久久久 | 久久久久久久久久电影 | 操操爽| 丁香5月婷婷久久 | 亚洲精品资源在线观看 | 中文字幕在线观 | 麻豆高清免费国产一区 | 国产精品久久久久久五月尺 | 88av网站| 日本中文乱码卡一卡二新区 | 国产成人久久久77777 | 中文字幕亚洲精品在线观看 | 成人av免费网站 | 天天干夜夜爱 | 91亚洲精品在线观看 | 色激情五月 | 亚洲人视频在线 | www.神马久久| 黄色在线免费观看网址 | 91精品国产91久久久久久三级 | 久久一区二区三区四区 | 日韩中文字幕在线 | 久久99操 | 久草视频视频在线播放 | 美女很黄免费网站 | 国产精品18p | 天堂入口网站 | 日日日操 | 国产精品久久一区二区三区不卡 | 欧美在线观看禁18 | 97av影院| 伊人久久五月天 | 91av久久 | 91在线看网站 | 欧美激情综合五月色丁香小说 | 91精品婷婷国产综合久久蝌蚪 | 色婷婷国产精品一区在线观看 | 黄色大片中国 | 国产精品久久久久久久久久久久午夜片 | 丝袜美女在线 | 久久久久久久久久久综合 | 午夜精品视频一区二区三区在线看 | 欧美激情精品久久久久久 | 久久99亚洲网美利坚合众国 | 国内揄拍国产精品 | 国产自产在线视频 | 国产午夜一区二区 | 91观看视频 | 国产日韩视频在线 | 日产av在线播放 | 久久精品久久精品久久精品 | www.99久久.com| www天天操 | 99久久er热在这里只有精品15 | 色婷婷天天干 | av激情五月 | 国产九九热视频 | 日韩av网站在线播放 | 五月天色婷婷丁香 | 欧美xxxxx在线视频 | 欧美一二三区在线观看 | 久草视频免费在线观看 | 国产在线91在线电影 | 精品亚洲免a | 日本久久久久久 | www亚洲精品 | 黄色毛片视频免费 | 欧美一级电影免费观看 | 中文字幕第一 | 91精品国产成人观看 | 久久久久精 | 在线 你懂 | 日本乱视频 | 国产欧美日韩一区 | 六月丁香激情综合 | 亚洲国产精品久久久久久 | 久久99精品热在线观看 | 中文字幕在线看片 | 91在线成人 | 久久99精品一区二区三区三区 | 伊人小视频 | 国产成人精品区 | 亚洲精品色 | 中文字幕一区二区三区在线观看 | 午夜精品一区二区三区可下载 | 亚洲精品一区二区在线观看 | 久久久香蕉视频 | av在线a| 国产99久久久久 | 在线看国产视频 | 久久综合九色 | 97在线免费观看 | 国产精品99久久久久久武松影视 | 国产专区视频在线观看 | 国产精品一区二区三区久久久 | 国产精品区免费视频 | 欧美一二三在线 | 综合国产视频 | 手机在线日韩视频 | 国产一区私人高清影院 | 免费观看一区 | 深夜福利视频在线观看 | 色在线高清 | 在线看黄网站 | 一本一本久久a久久 | 久久久久久欧美二区电影网 | 国产 视频 久久 | av黄色国产| 午夜久久久精品 | 日韩a免费 | 天堂久色 | 亚洲乱码精品久久久久 | 国产精品美女久久久久aⅴ 干干夜夜 | 综合网伊人 | 啪啪凸凸 | 天天操综合网 | 就色干综合 | 国产中文字幕在线观看 | 91中文字幕在线 | 在线观看亚洲国产精品 | 日韩久久久久 | 在线观看国产区 | 狠狠色丁香婷婷 | 西西444www高清大胆 | 成人在线免费看视频 | 中文字幕在线观看第二页 | 国产亚洲精品女人久久久久久 | 天天爱综合| 久久精品79国产精品 | av福利在线看 | 中文乱幕日产无线码1区 | 免费看片网站91 | 国产精品久久久久久久久久久久冷 | 欧美日韩国产亚洲乱码字幕 | 人人插人人澡 | 国产免费区 | 黄色一级片视频 | 色在线亚洲 | 97av视频| av网站免费看 | av大片免费看| av电影不卡在线 | 日本公妇在线观看高清 | 久综合网 | av一本久道久久波多野结衣 | 免费视频97 | 超碰在线色 | 久99久精品 | 免费在线观看视频a | 久久久免费在线观看 | 国产国产人免费人成免费视频 | 久久伊人五月天 | sm免费xx网站 | 毛片网站免费在线观看 | 特级西西444www大胆高清无视频 | 国产原创在线观看 | 久久久免费av | 成人app在线免费观看 | 蜜桃视频在线视频 | 日本性久久| 国产精品久久久久久久久久久久久久 | 九九视频网 | 免费看一级一片 | 日韩欧美在线一区二区 | 精品国产1区二区 | 亚洲国产中文字幕在线 | 一区 二区 精品 | 日韩特级片 | 色婷婷综合久久久久 | av字幕在线 | 97天堂网 | 久久久久久久久久影视 | 深夜免费小视频 | 成年人视频在线免费播放 | 日韩精品91偷拍在线观看 | 免费在线观看亚洲视频 | 国产精品美女久久久久aⅴ 干干夜夜 | 国产一级精品在线观看 | 亚州精品天堂中文字幕 | www黄色av| 一色av| 九九热精品视频在线观看 | 日韩影视大全 | 免费观看一级 | 日韩高清一区在线 | 婷婷久久一区二区三区 | 一区 二区电影免费在线观看 | 在线看一区二区 | av中文字幕亚洲 | 国产一区在线视频播放 | 精品一二三四视频 | 三级黄色网络 | 国产精品99久久久久人中文网介绍 | 国产精品av在线免费观看 | 中文字幕黄色网址 | 日韩av成人在线观看 | 日韩一级黄色片 | 欧美日韩xxx | 国产无遮挡又黄又爽在线观看 | 国产高清精品在线观看 | 麻豆视频国产在线观看 | 欧美日韩国产精品一区二区亚洲 | 91在线视频免费播放 | 亚洲aⅴ在线观看 | 一区二区电影在线观看 | 成人在线免费看 | 一区二区在线影院 | 丁香婷婷综合色啪 | 欧美激情一区不卡 | 丁香激情综合久久伊人久久 | 婷婷综合在线 | 久久国精品 | 69视频在线播放 | 色噜噜日韩精品一区二区三区视频 | 91禁在线看 | 欧美日韩在线观看一区二区 | 8x8x在线观看视频 | 色射色 | 国产精品久久久久久电影 | 国产亚洲精品久久19p | 国产视频一区精品 | 亚洲理论在线观看 | 91精品视频在线 | 四虎在线免费观看 | 九九热免费在线观看 | 日日草夜夜操 | 久久成人国产 | 亚洲六月丁香色婷婷综合久久 | 操操操综合 | 日日夜夜91 | 久久综合射 | 国产精品久久久777 成人手机在线视频 | 午夜黄色一级片 | 97超碰在线资源 | 成人黄色免费在线观看 | 国产精品麻豆99久久久久久 | 91中文在线视频 | 911免费视频 | www色网站 | 亚洲劲爆av| 亚洲精品777 | 99re国产| 色停停五月天 | 久久免费视频1 | 免费网址在线播放 | 色香com.| 中文字幕在线观看视频网站 | 黄色电影在线免费观看 | 91精品久久久久久 | 天天弄天天操 | 中文字幕一区二区在线播放 | 懂色av一区二区在线播放 | 国产精品高潮在线观看 | 91刺激视频 | 亚洲激情校园春色 | 国产精品久久久区三区天天噜 | 97福利 | 中文字幕亚洲精品在线观看 | 免费观看国产精品视频 | 国产精品综合久久久 | 在线观看激情av | 国内揄拍国内精品 | www.五月婷婷.com | 热99在线| 日本精品va在线观看 | 99re8这里有精品热视频免费 | 91精品久久久久久久久久入口 | 激情五月婷婷综合网 | 天天插天天狠天天透 | www.com.黄| 色综合综合 | 免费视频三区 | 天天操天天艹 | 亚洲精品久久激情国产片 | 香蕉视频在线网站 | 91.麻豆视频 | 超碰人人草人人 | 五月综合激情婷婷 | 精品国产123 | 成年美女黄网站色大片免费看 | 欧美精品乱码久久久久久按摩 | 韩日成人av | 你操综合| 99久久99久久精品国产片果冰 | 色爱区综合激月婷婷 | 国产码电影 | 最近日本中文字幕a | 国产精品视频不卡 | 精品久久久影院 | 日本午夜在线亚洲.国产 | 欧美一级大片在线观看 | 波多野结衣视频一区二区 | 国产午夜精品一区二区三区嫩草 | 日日夜夜av | 国产精品系列在线 | 久久激五月天综合精品 | 国产成人99久久亚洲综合精品 | 免费视频二区 | 成年人国产精品 | 日日摸日日添夜夜爽97 | 中文字幕有码在线 | 又爽又黄在线观看 | 国产一区私人高清影院 | 成人亚洲网 | 日韩伦理片hd | 99热精品免费观看 | 亚洲高清网站 | 狠狠狠狠狠狠狠干 | 日日干av| 中文字幕欲求不满 | 成人国产精品一区 | 国产不卡在线观看视频 | 中文字幕第一页在线 | 欧美一级久久久久 | 天天综合网在线 | 欧美久久久久久 | 成人在线播放免费观看 | 欧美性色xo影院 | 天天干 夜夜操 | 97精品电影院 | 成人午夜精品福利免费 | 国产a视频免费观看 | 夜夜躁狠狠躁 | 久久成人国产精品入口 | 久久成人精品视频 | 九九热1 | 国产精品久久久久久久久久久久久久 | 久久无码av一区二区三区电影网 | 国产一级做a爱片久久毛片a | 精品一区二区精品 | 国产黑丝袜在线 | 91视频3p| 能在线看的av | 精品 激情 | 亚洲人久久久 | 高清av中文字幕 | 草久在线播放 | 国产高清av在线播放 | 中文字幕在线观看视频免费 | 色天堂在线视频 | 久久精品草 | 免费看片成人 | 国产成人一二片 | 国产美女精品久久久 | 日韩色中色 | 深夜男人影院 | 国产精品免费观看国产网曝瓜 | 久久激情小视频 | 久久精品免费电影 | 在线观看av国产 | 97视频总站 | 国产成人精品一区二区三区在线观看 | 日韩av不卡在线 | 亚洲精品综合欧美二区变态 | 在线视频久久 | 999视频在线观看 | av大片网站 | 黄污视频网站 | 久久毛片网 | a级国产乱理伦片在线观看 亚洲3级 | 日韩网站在线播放 | 国产午夜精品一区二区三区 | 成人黄色在线 | 欧美日韩国产在线一区 | 成人羞羞视频在线观看免费 | 国产欧美精品一区aⅴ影院 99视频国产精品免费观看 | 久久久久久久久网站 | 久久久亚洲国产精品麻豆综合天堂 | 爱干视频 | 国产精品免费看久久久8精臀av | www.色婷婷| 婷婷久久综合网 | 亚洲国产精品久久久久婷婷884 | 最新国产视频 | 偷拍久久久 | 狠狠操导航 | 久久久久99精品成人片三人毛片 | 久久久国产影视 | 91在线精品观看 | av在线电影免费观看 | 亚洲人成人在线 | 国产免费亚洲 | 国产日韩精品一区二区三区 | 久久视频网 | 99久久毛片| 国产不卡在线视频 | 久久av免费| 久久久免费毛片 | 成人在线一区二区 | 色婷婷播放 | 99婷婷| 超碰在线cao| 久久精品国产一区二区三区 | 欧美精品黑人性xxxx | av片子在线观看 | 久久国产日韩 | 色综合中文字幕 | 一区二区三区视频在线 | 亚洲成av| 日本成址在线观看 | 久久国产精品久久久久 | 九九久久精品视频 | 日本中文字幕视频 | ,午夜性刺激免费看视频 | 1000部18岁以下禁看视频 | 久久久久久久久艹 | 国产精品视频不卡 | 九九久久国产精品 | 亚洲电影一级黄 | 激情欧美丁香 | 久久香蕉电影网 | 日韩视频二区 | 国产剧情av在线播放 | 欧美aaa大片 | 日韩视频中文字幕 | 午夜av在线电影 | 国产精品18久久久久久久久久久久 | 精品久久久久久久 | 国产高清视频在线播放 | 国产视频1区2区3区 久久夜视频 | 日韩一区二区三免费高清在线观看 | 国产精品18p| 黄色a三级 | av福利在线免费观看 | va视频在线 | 美女激情影院 | 麻豆 videos| 狠狠综合网 | 国产午夜一级毛片 | 婷婷网站天天婷婷网站 | 69精品在线 | 国产黄色特级片 | 国产精品久久久久久模特 | 欧美另类69 | 亚洲影院天堂 | 欧美性生活免费 | 久久精品日产第一区二区三区乱码 | 国产专区第一页 | 亚洲一区精品人人爽人人躁 | 操碰av | 91大神电影| 亚洲综合精品在线 | 午夜精品久久久久 | 亚洲日本激情 | 欧美精品少妇xxxxx喷水 | 欧美日韩在线精品 | www看片网站 | 色偷偷88欧美精品久久久 | 天堂av高清 | 免费视频你懂得 | 伊人天堂久久 | 色视频网站在线 | 久久免费视频在线观看 | 亚洲男男gⅴgay双龙 | 国产一区二区三区四区在线 | 亚洲精品小视频在线观看 | 91av在线国产 | 美女网站在线观看 | 天天射天天操天天 | 精品久久久久久久久久久久久久久久久久 | 欧美性另类 | 精品国产欧美 | 成人黄在线观看 | 久久综合网色—综合色88 | 日本三级不卡 | 成人免费在线看片 | 久久一区二区免费视频 | 天天综合久久综合 | 97人人超| 97香蕉视频 | 日韩精品一区二区在线观看 | 一级免费看 | 国产精品一区二区三区99 | 精品久久久久久久久久岛国gif | 婷婷丁香国产 | 日韩欧美视频免费观看 | 成人丝袜 | 91精彩视频在线观看 | 黄色片网站免费 | 国产成人一区在线 | 特级毛片网站 | 久久精品欧美日韩精品 | 91丨九色丨高潮 | 在线观看片 | 国产美女精品人人做人人爽 | 亚洲无吗天堂 | 亚洲精品免费在线观看视频 | 91视频午夜| 久久伊人八月婷婷综合激情 | 在线观看免费高清视频大全追剧 | 国产无遮挡又黄又爽馒头漫画 | 91探花在线视频 | 亚洲精品久久久久58 | 99精品视频在线免费观看 | 成人三级网站在线观看 | 国产精品永久在线观看 | 狠狠色噜噜狠狠狠狠2022 | 色偷偷男人的天堂av | 免费观看全黄做爰大片国产 | 操操操综合 | 麻豆播放| 亚洲五月婷 | 欧美另类高清 | 日韩中文字幕在线 | 中文字幕第一页在线视频 | 500部大龄熟乱视频使用方法 | 日韩高清免费在线 | 国产一级淫片在线观看 | 国产精品 日韩 欧美 | 免费看的黄色的网站 | 丁香六月五月婷婷 | 国产最新视频在线观看 | 99精品视频在线播放免费 | 成人午夜剧场在线观看 | 丝袜美女视频网站 | 伊人网综合在线观看 | 超碰人人干人人 | 欧美精彩视频在线观看 | 亚洲国产97在线精品一区 | 欧美日韩精品区 | 国产精品12 | 精品国产乱码久久久久久浪潮 | 国产中文字幕在线观看 | 在线观看视频 | 精品国产欧美一区二区 | 又黄又爽又刺激的视频 | 免费观看一级特黄欧美大片 | av在线免费观看网站 | 亚洲电影第一页av | 日批视频 | 三级黄色片子 | 久久 精品一区 | 成人免费共享视频 | 97在线观看免费高清完整版在线观看 | 99久久精品久久久久久清纯 | 国产高清不卡 | 丁香视频全集免费观看 | 色综合久久88色综合天天人守婷 | 免费在线播放 | 日韩av一区在线观看 | 男女视频久久久 | 又长又大又黑又粗欧美 | 久av电影| 国产高清免费观看 | 亚洲黄色成人网 | 免费能看的av | 波多野结衣电影一区 | 日韩aa视频| 欧美成人h版电影 | 国产一线二线三线性视频 | 国产69精品久久app免费版 | 久久精品日产第一区二区三区乱码 | 亚洲一级电影 | 国内揄拍国产精品 | 欧美日韩一区二区久久 | 91日本在线播放 | 精品国产一区二区三区在线 | 日韩精品无 | 久久久午夜视频 | 亚洲免费永久精品国产 | 在线观看免费 | 青青河边草免费视频 | 亚洲人成人99网站 | 高清在线一区二区 | 久久久www成人免费毛片麻豆 | 亚洲日本三级 | 中文字幕精品在线 | 欧美日韩中文字幕综合视频 | 日本少妇久久久 | 天天操天天吃 | 久草在线视频免费资源观看 | 天天干天天做天天爱 | 久久在草 | 综合网天天 | 成人午夜性影院 | 久久久精品一区二区三区 | 激情视频一区二区三区 | 97成人在线观看 | 亚洲综合欧美精品电影 | 亚洲精品小区久久久久久 | 日韩在线观看中文 | 精品一区 在线 | 在线午夜电影神马影院 | 国产免费久久 | 日韩特级毛片 | 国产视频97 | 噜噜色官网 | 色婷婷啪啪免费在线电影观看 | 色av男人的天堂免费在线 | 草久电影| 欧美日韩有码 | 午夜色大片在线观看 | 最近中文字幕在线 | 少妇性bbb搡bbb爽爽爽欧美 | 婷婷精品国产欧美精品亚洲人人爽 | 免费三级a | 天天干天天拍天天操 | 国产99久| 91片网| 成人蜜桃视频 | 日韩精品中文字幕一区二区 | 精品久久久久久国产 | 国产视频在线免费观看 | 伊人电影在线观看 | 91久久爱热色涩涩 | 香蕉在线视频播放网站 | 亚洲精品国产免费 | 国产精品国产三级国产不产一地 | 最近最新mv字幕免费观看 | 视频1区2区 | 国产精品女同一区二区三区久久夜 | www久草| 99精品视频在线免费观看 | 国产午夜精品免费一区二区三区视频 | 手机在线看永久av片免费 | 人人插人人爱 | 91视频传媒 | 久久精品视频观看 | 亚洲一区网 | 欧美视频国产视频 | 国产成人av网站 | 日日干天天 | 国语自产偷拍精品视频偷 | 精品不卡av | 欧美黑人性猛交 | 久久久久久久久久影视 | 玖玖玖在线观看 | 久久综合久久伊人 | 成人一级免费视频 | av成人动漫在线观看 | 久久久久久久久久久黄色 | 日日碰狠狠躁久久躁综合网 | 中文字幕在线观看国产 | 国产精品久久久久婷婷二区次 | 成人av视屏 | 欧美日韩在线播放一区 | 毛片黄色一级 | 国产亲近乱来精品 | 亚洲成人免费在线观看 | 日韩在线视频免费观看 | 久久久免费看视频 | 久久公开视频 | 免费人成网 | 国产精品美女久久久久久久久久久 | 日韩欧美黄色网址 | 欧美日韩久久一区 | 99精品一区 | 青草视频在线看 | 伊人天堂av | 色999五月色| 亚洲一区二区三区毛片 | 天天插夜夜操 | 欧美性精品 | 国产精品午夜av | 黄色影院在线免费观看 | 国产精品原创av片国产免费 | 美女视频黄免费的 | 精品福利视频在线 | 99视频免费| 操操操av | 91x色 | 国产精品麻豆一区二区三区 | 欧美在线视频日韩 | 美女啪啪图片 | 国产精品网址在线观看 | 日韩国产精品一区 | 狠狠色丁香久久婷婷综合丁香 | 免费成人在线观看 | 日韩在线视频不卡 | 天天干天天拍天天操 | 五月天丁香视频 | 久久精品国产一区二区三区 | 精品视频在线播放 | 亚洲高清视频在线观看免费 | 四虎影院在线观看av | 国产精品久久久久久久久久免费 | 国产欧美久久久精品影院 | 国产午夜精品理论片在线 | 亚洲欧美一区二区三区孕妇写真 | 成年人在线观看视频免费 | 99久久99视频| 欧美精品一区二区三区四区在线 | 五月天激情在线 | 中文字幕在线观看视频一区 | 2024国产精品视频 | av免费福利 | 色婷婷88av视频一二三区 | 亚洲精品久久久久久久蜜桃 | 久久久久久久久影视 | 久久中文欧美 | 国产精品18久久久久久不卡孕妇 | 激情影院在线观看 | 一区二区三区福利 | 国产伦精品一区二区三区… | 黄色毛片视频免费观看中文 | 一区二区av | 在线观看一区 | 国产精品久久久久久久婷婷 | 手机在线小视频 | 中国一级片在线播放 | 99久久这里有精品 | 久草视频在线资源 | 国产黄a三级 | 欧美少妇bbwhd| 国产99久久九九精品 | 色噜噜日韩精品一区二区三区视频 | 粉嫩av一区二区三区四区 | 亚洲国产视频a | 精品在线一区二区三区 | 日韩精品免费一区二区三区 | 西西大胆免费视频 | 亚洲男男gaygay无套 | 成人av电影免费在线观看 | 91丨九色丨丝袜 | 欧美日韩在线视频一区二区 | 亚洲欧洲国产日韩精品 | 午夜婷婷在线播放 | 国产精品久久久久久久久久久久午夜片 | 亚洲一级国产 | 亚洲成人资源在线观看 | 日韩激情免费视频 | 黄色一级影院 | 欧美天堂影院 | 欧美久久综合 | 国产女教师精品久久av | 亚洲三级国产 | 日韩欧美91 | 97视频总站 | 久久婷婷激情 | 91精品国产91久久久久久三级 | 亚洲婷婷免费 | 免费一级日韩欧美性大片 | 一区二区三区高清在线观看 | 欧美精品久久久久久久久老牛影院 | 91久久国产自产拍夜夜嗨 | 日本久久不卡视频 | 久久精品4 | 欧美精品九九99久久 | 久久精品日本啪啪涩涩 | 久久久香蕉视频 | 色视频 在线| 欧美日韩高清在线观看 | 综合久久久 | 日本二区三区在线 | 亚洲狠狠丁香婷婷综合久久久 | 深夜福利视频一区二区 | 激情九九 | 91久久久久久久 | 91精品国产92久久久久 | 久久avav| 久久免费的视频 | 色综合婷婷 | 日韩天天综合 | 日日夜夜精品免费观看 | 久久亚洲日本 | 精品久久久久久久久久久久 | 久久久黄色av | 色a资源在线| 色婷婷激情四射 | 毛片网在线播放 | 亚洲一区在线看 | 在线免费观看国产视频 | 久久高清国产 | 日韩久久久久 | 亚洲国产精品99久久久久久久久 | 正在播放久久 | 久草a视频| 天天射天 | 中文av在线播放 | 国产黄色av网站 | av先锋中文字幕 | 久久久久电影 | 最新国产中文字幕 | 日本韩国在线不卡 | 久久精品免费播放 | a级国产乱理伦片在线播放 久久久久国产精品一区 | www.夜夜爽 | 中文字幕不卡在线88 | 色噜噜日韩精品一区二区三区视频 | 九色最新网址 | 麻豆91小视频 | 欧美一级免费在线 | 伊人小视频 | 超碰日韩在线 | 伊人网综合在线观看 | 91精品在线观看入口 | 丁香综合网 | 国产99久久久国产 | 色综合 久久精品 | 欧美伦理一区 | 中文在线a在线 | 国产成人一区二区啪在线观看 | 免费视频久久久久久久 | 久久精品福利 | 日本免费一二三区 | av在线免费播放网站 | 亚洲午夜av电影 | 国产精品免费视频一区二区 | 人人揉人人揉人人揉人人揉97 | 97日日碰人人模人人澡分享吧 | 日韩网页 | av大全在线播放 | 中文字幕中文 | 免费看国产视频 | 国产精品观看在线亚洲人成网 | 欧美性大战| 国内一级片在线观看 | 日韩视频免费 | 粉嫩av一区二区三区四区 | 国产精品美女在线观看 | 国产精品理论片 | 久久人人爽人人爽 | 国产精品9999久久久久仙踪林 | 美女视频网站久久 | av.com在线| 久久国产精品久久精品 | 国模精品在线 | 98超碰人人| 69精品在线| 亚洲精品免费观看 | 13日本xxxxxⅹxxx20 | 最新av网址在线 | 天天狠狠干 | 草久在线视频 | 国产第一页精品 | 福利视频一二区 | 国产在线观看黄 | 国产精品porn| 国产成人精品亚洲精品 | 国产精品一区二区三区四区在线观看 | 久久精品国产一区 | 欧美精品视 | 国产成人久久精品77777 | 日韩av有码在线 | 亚洲精品女人久久久 | 久久亚洲私人国产精品va | 亚洲精品456在线播放 | 婷婷电影在线观看 | 国产精品视频不卡 | 91视频亚洲 | 欧美午夜精品久久久久 | 亚洲自拍av在线 | 在线观看深夜福利 | 欧美,日韩| 亚洲乱码一区 | 亚洲精品国偷自产在线91正片 | 五月天亚洲激情 | 欧美视频在线观看免费网址 | 免费a v在线 | 国产青青青 | 日韩成人看片 | 亚洲精品福利在线观看 | 五月婷婷久 | 国产偷国产偷亚洲清高 | 国产小视频在线免费观看视频 | av在线永久免费观看 | 成人黄色小说视频 | 五月的婷婷 | 亚洲精品一区二区精华 | 亚洲在线视频观看 | 欧美日韩视频在线观看免费 | 在线视频国产区 | 日日麻批40分钟视频免费观看 | 456成人精品影院 | 日韩免费电影网 | 欧美日韩视频 | 伊人亚洲综合网 | av超碰在线 | 国产成人精品综合久久久 | h视频日本 | 国产在线观看 | 国产一区二区中文字幕 | 免费看国产视频 | 成人av一二三区 | 日本中文字幕系列 | 最新av在线网站 | 2019天天干夜夜操 | 日韩免费观看av | 成人黄色视| av在线进入 | 九九日九九操 | 在线观看日韩国产 | 国产精品网站一区二区三区 | 五月婷婷在线观看视频 | 国产九九九九九 | 人人插人人干 | 亚洲理论在线观看电影 | 国产精品视频免费 | 日韩专区在线播放 | 久久综合中文色婷婷 | 亚洲区另类春色综合小说 | 丁五月婷婷 | 九九九热精品免费视频观看 | 国产亚洲精品久久久久久网站 | 国产精品久久一区二区三区, | 国产一级二级在线 | 91在线免费看片 | 精品国产一区二区三区久久 | 国产专区在线 | 久久爱资源网 | 少妇bbbb揉bbbb日本 | 韩国一区二区三区视频 | 色99导航| 久久高清免费 | 九九热免费视频在线观看 | 日韩在线小视频 | 国产欧美精品一区二区三区四区 | 操操色 | 国产午夜精品免费一区二区三区视频 | 黄色成人在线 | 91精品久久久久久久久久入口 | 综合色婷婷 | 国产高清av免费在线观看 | 热久久精品在线 | 午夜天使 | 国产精品一区二区久久精品爱涩 | 草在线 | 国产一级免费播放 | 美女免费视频黄 | 日韩精品电影在线播放 | av电影在线免费 | 国产精品白丝jk白祙 | 91精品亚洲影视在线观看 | 四虎在线视频免费观看 | 天堂在线一区二区三区 | 国内精品国产三级国产aⅴ久 | 国产片免费在线观看视频 | 999精品网 | 激情综合久久 | 久久久www成人免费毛片麻豆 | 亚州av网站 | 日韩国产精品一区 | 午夜精品久久久99热福利 | 国产无套精品久久久久久 | 伊人国产在线播放 | 欧美精品久久久久久久久久丰满 | 日韩美女一级片 | a视频免费在线观看 | 91亚洲欧美激情 | 青青河边草免费直播 | 999久久久久久久久6666 | 久久艹久久 | 色婷婷视频 | 国产在线不卡一区 | 免费看av片网站 | 久久夜色精品国产欧美乱极品 | 韩国av一区二区三区在线观看 | 久要激情网 | 国产精品高清在线 | 国内精品久久久久久久97牛牛 | 免费福利在线 | 国产精品国产三级国产aⅴ无密码 | av三级在线播放 | 三级黄在线 |