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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

数据结构-红黑树

發布時間:2024/1/17 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据结构-红黑树 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本文由@呆代待殆原創,轉載請注明出處:http://www.cnblogs.com/coffeeSS/

?

學習紅黑樹的前置技能:二叉搜索樹http://www.cnblogs.com/coffeeSS/p/5452719.html

?

紅黑樹簡介

紅黑樹是一種自平衡(平衡指所有葉子的深度趨于相等)二叉查找樹,它是在1972年由1972年由魯道夫·貝爾發明,這個數據結構對插入時間、刪除時間和查找時間提供了最好可能的最壞情況擔保(也就是說同樣都在最壞情況下,他的速度比一般的樹的速度要快)無論是查找,插入還是刪除都可以在O(lgn)內完成,所以很適合用在時間敏感的場合中。

?

紅黑樹的性質

紅黑樹就是有顏色的二叉查找樹,并且要滿足以下5個約束:

1,節點不是紅色就是黑色。

2,根節點是黑色。

3,所有葉子節點都是黑色(這里所有葉子節點指的是NIL節點)。

4,每個紅色節點的兩個孩子都是黑色。

5,任意一個節點到其每個葉子的所有簡單路徑(簡單路徑指路徑中不會出現重復節點)都包含相同數目的黑色節點。

?

紅黑樹的每個節點至少包含5個屬性:color、key、left、right與parent。

如果一個節點沒有子節點或者父節點則相應的指針設為null或者指向NIL節點。

根節點是唯一一個parent為NIL的節點。

紅黑樹的所有葉子節點都是NIL節點,但是在很多實例圖中這些NIL節點都會被省略,而且實際實現中,如果真的實現NIL節點,一般只會設置一個NIL節點,讓所有指向葉子節點的節點都指向這個節點,根節點的parent指針也會指向這個節點(當然你簡單的將這些指向NIL節點的指針都設成null也是可以的,但是本文的代碼實現是基于NIL節點的,因為這樣代碼寫起來更自然一點)。

NIL節點的作用是充當哨兵和完善紅黑樹的結構,它的color屬性為black,其他屬性都沒有實際意義,設為null或者不管都可以。

下面看一張來自WIKI百科的紅黑樹的圖例

上面的約束確定了一個紅黑樹的關鍵特性:從根到葉子的最長的可能路徑不多于最短可能路徑的兩倍。 證明這個特性的正確性:因為由約束4可知,不可能存在兩個相鄰的紅色節點,這個結論再配合約束5可知最短的路徑一定是全黑的路徑,設這個路徑上有n個黑節點,那么最長的路徑也一定有n個黑節點,而且最長路徑的節點數減去最短路徑的節點數就是最長路徑中紅色節點的數目,那么我們只有在n個黑色節點中盡可能多的插入紅色節點就行了,在這5個約束下,我們只能讓紅黑節點交替出現,而且因為根節點和葉子節點都是黑色的,所以我們最多只能插入n-1個節點,所以當最短路徑有n個節點時,最長路徑最多只有2n-1個節點,完全滿足上述特性。 本文紅黑樹的結構 本文將實現以下包含以下結構和方法的紅黑樹(C++) 1 enum Color{black,red}; 2 3 struct Node{ 4 Node(){ color = black; } 5 Node(int k) :key(k){ color = red; } 6 Node* parent = nullptr; 7 Node* left = nullptr; 8 Node* right = nullptr; 9 Color color; 10 int key; 11 }; 12 13 class MyRBT{ 14 private: 15 Node* nil=new Node(); 16 Node* root=nil; 17 void fix_color(Node* n);//插入過程中有可能遞歸的部分 18 Node* getUncle(Node* n);//返回n的叔節點 19 void left_rotate(Node* n);//左旋 20 void right_rotate(Node* n);//右旋 21 Node*& parentToN(Node* n);//獲得n的父節點里指向n的那個指針 22 Node* getSibling(Node* n);//返回n的兄弟節點 23 bool isParentLeftChild(Node* n);//判斷n是不是父節點的左孩子 24 void delete_fix_color(Node* n);//刪除過程中有可能遞歸的部分。 25 public: 26 MyRBT(){}; 27 MyRBT(vector<int> v); 28 Node* getRoot(){ return root; } 29 void insertNode(int k); 30 void deleteNode(int k); 31 Node* findByKey(int k); 32 Node* findSuccessor(int k); 33 Node* findPredecessor(int k); 34 void traversal(Node* root, void(*f)(int k) = [](int k)->void{cout << k << " "; });//遍歷輸出所有節點 35 void insertNode(Node* n); 36 void deleteNode(Node* m); 37 Node* findSuccessor(Node* n);//找n的后繼 38 Node* findPredecessor(Node* n);//找n的前驅 39 };

?

其中除了插入和刪除操作,其他操作和二叉搜索樹沒什么區別,只是這里的版本都是基于NIL節點實現的,而之前的二叉搜索樹那篇是基于nullptr實現的,本質上沒有任何區別,所以本文重點介紹插入刪除操作。

紅黑樹的操作 紅黑樹的只讀操作和普通的二叉查找樹沒有區別(只讀操作包括查找,遍歷等),但是插入和刪除操作和普通的二叉搜索樹是不一樣的,因為紅黑樹要始終保持上述5個約束不被破壞,如果在插入或者刪除某個節點的時候破壞了紅黑樹的約束,我們可以通過旋轉操作來調整這棵樹讓它重新滿足這5個約束,那么再我們介紹插入和刪除前先讓我們來看一看什么是旋轉操作吧。 旋轉操作 如圖是一張來自《算法導論》的圖示,從上面可以直接看出,旋轉操作分為左旋和右旋,并且他們為互逆的操作。
左旋(left_rotate):在x節點上進行左旋操作時假設他的右孩子(y節點)不是NIL節點,并且x節點也不是NIL節點,左旋結束后,如圖,x節點成為y節點的做孩子,y節點取代了x節點的位置,其實仔細看一下就知道,左旋就是原本指向x節點的指針指向了x節點的右孩子,相當于整個以x為根節點的子樹向左轉動了一下而已,是一個相當簡單的操作。 右旋(right_rotate):假設右旋節點的左孩子和這個節點不為NIL節點,其他和上述左旋類似,不再贅述。 再給出左旋,右旋的代碼前,我們先給出這個方法的代碼?Node*& parentToN(Node* n);//獲得n的父節點里指向n的那個指針? 取得n節點的父節點比較容易,但是再從父節點取到n節點需要確定n節點是父節點的左孩子還是右孩子,因為我們經常要讓n節點的父節點指向n的指針指向一個新的節點,所以我們封裝一下這個方法比較好,這個方法返回的是左值,可以直接對其賦值。 1 Node*& MyRBT::parentToN(Node* n){ 2 if (n->parent == nil) return nil; 3 if (n->parent->left == n) 4 return n->parent->left; 5 else return n->parent->right; 6 }

?然后我們給出左旋和右旋操作的代碼,結合上面的圖來理解比較好。

1 void MyRBT::left_rotate(Node* n){ 2 if (n->right == nil)//設n的右孩子為y 3 cout << "left_rotate error" << endl; 4 parentToN(n) = n->right;//修改n的父節點指向y 5 n->right->parent = n->parent;//修改y的parent指針 改y->parent 為 n->parent 6 n->parent = n->right;//修改n的parent指針 改n->parent 為 n->right 7 n->right = n->right->left;//將y的左子樹變成n的右子樹 改n->right 為 y-left 8 n->parent->left = n;//將n改成y的左孩子 ,這個時候取原來n的右孩子不能通過n->right,因為上一句中已經改變了r->right,但是看到上上一句就知道n->parent現在指向n的原先的右孩子 改y->left 為 n 9 } 10 void MyRBT::right_rotate(Node* n){ 11 if (n->left == nil) 12 cout << "right_rotate error" << endl; 13 parentToN(n) = n->left; 14 n->left->parent = n->parent; 15 n->parent = n->left; 16 n->left = n->left->right; 17 n->parent->right = n; 18 }

?

插入操作 給紅黑樹插入節點時,插入的節點會標為紅色(因為如果你插入的是黑色節點,你就會破壞約束5,直接插入紅色節點可以避免破壞這個約束,減小了破壞約束的概率),但是插入后,仍然有其他約束可能被破壞,歸納一下有5種情況需要我們來處理 注:插入節點我們用n來指代,其父節點用p來指代,叔節點用u來指代,祖父節點用g來表示。 1,n是根節點(破壞了約束2). 2,n的p節點是黑色。 3,n的p節點和u節點都是紅色。 4,n是g節點的左孩子的右孩子,或者是g節點的右孩子的左孩子。(p是紅的,而u是黑的) 5,n是g節點的左孩子的左孩子,或者是g節點的右孩子的右孩子。(p是紅的,而u是黑的) 對于這五種情況需要依次判斷。 情況一:這種情況很簡單,只要把n染成黑色的就解問題了。 情況二:這種情況下,沒有任何規則被違反,不需要處理。 情況三:這種情況下,我們會違反約束4,所以我們要將p與u染成黑色,并且將g染成紅色,這樣就解決了局部問題,但是這樣也許會導致g節點違反約束,此時的g節點就像是剛插入的新節點一樣需要從情況一開始判斷是否違反約束。 情況四:如果n是g節點的左孩子的右孩子,那么我們對n進行左旋,如果n節點是g節點的右孩子的左孩子,那么我們對p進行右旋,這是情況四會轉換成情況五,然后我們就用情況五去解決剩下的問題(因為此時約束4仍然不滿足) 情況五:如果n是g節點的左孩子的左孩子,那么我們對g節點右旋,如果n節點是g節點的右孩子的右孩子,那么我們對g節點左旋,然后將此時的根節點染成黑色(如果是紅色會違反約束四),將根節點的兩個孩子染成紅色,此時樹就被修復了。 這就是插入新節點需要考慮的問題。那么我們接下來集中解決一些相關問題。 問題一:為什么只有這些情況(注意插入的操作前半部分是和二叉搜索樹一樣的)。 答:首先一個節點插入要么他在根上,那么就是情況一;要么他的深度為2,只有p節點(此時p是跟節點只能是黑的),沒有g節點,這是情況二;如果深度大于二,那么首先考慮父節點那一層,如果都是黑的,那么可以當做情況二來處理,如果p是黑的,u是紅的,也可以當做情況二處理;如果p是紅的u是黑的那么進入情況四與情況五,如果p與u都是紅色的,這是情況三。 問題二:為什么分情況的時候不考慮g上面的其他節點呢? 答:太上面的節點我們已經是規范的了,如果我們能解決g節點一下的不規范,g節點以上是不用管的,但是如果我們改變了g節點的顏色,我們就要對g節點進行上述判斷,這是情況三中的一部分。 問題三:為什么不考慮g節點的顏色呢? 答:g節點的顏色我們不需判斷(g一定是黑的,因為p是紅的),理由如下,涉及到g節點的過程情況是三到五,在情況三中,我們一定會把g節點染成紅色并把它當成剛插入的節點來重新判斷,所以g節點原本是什么顏色不重要;如果判斷流程進入情況四,那么一定會進入情況五,而情況四種沒有針對g的操作,所以g的顏色對過程四也不重要,情況五中,g的孩子節點一定會取代g節點的位置,而且這個新的根節點會被染成黑色,之后g節點也一定會被我們染成紅色,所以g的顏色對情況2五也不重要。 問題四:情況五中,為什么我們要將新的根節點染黑而不通過調整子節點的顏色來規范紅黑樹呢? 答:因為之前的根節點一定是黑色,如新的根節點顏色改變,那么我們不得不對新的節點重新判斷,看它是否也破壞了紅黑樹到的約束,所以將新的根節點涂成黑色,可以將矛盾控制在內部,方便解決。 問題五:有全黑的紅黑樹么? 答:有啊,只有一個根節點的時候,其他情況,你可以自己試試看= = 下面給出插入方法的實現,插入的過程和二叉搜索樹差不多,不再寫注釋,不同的部分在于用NIL節點代替了nullptr,并增加了修正顏色用的方法?void fix_color(Node* n);//插入過程中修正顏色的方法?對這個方法的理解是重點所在。 首先再給出一個輔助方法?Node* getUncle(Node* n);//返回n的叔節點? 1 Node* MyRBT::getUncle(Node* n){ 2 if (n->parent != nil&&n->parent->parent != nil){ 3 if (n->parent->parent->left == n->parent) 4 return n->parent->parent->right; 5 else return n->parent->parent->left; 6 } 7 return nullptr; 8 }

?

下面是插入算法本體和fix_color方法 1 void MyRBT::insertNode(int k){ 2 insertNode(new Node(k)); 3 } 4 5 void MyRBT::insertNode(Node* n){ 6 Node* temp = root; 7 if (temp == nil){ 8 root = n; 9 root->parent = nil;//root的父節點指向nil 10 root->left = nil; 11 root->right = nil; 12 fix_color(n); 13 return; 14 } 15 while (true){ 16 if (temp->key > n->key){ 17 if (temp->left != nil) 18 temp = temp->left; 19 else{ 20 temp->left = n; 21 n->parent = temp; 22 n->right = nil; 23 n->left = nil; 24 fix_color(n); 25 return; 26 } 27 } 28 else{ 29 if (temp->right != nil) 30 temp = temp->right; 31 else{ 32 temp->right = n; 33 n->parent = temp; 34 n->right = nil; 35 n->left = nil; 36 fix_color(n); 37 return; 38 } 39 } 40 } 41 } 42 43 //nil節點的存在是為了保證數結構的完整性和規范性 44 45 void MyRBT::fix_color(Node* n){ 46 if (n->parent == nil)//情況一 47 n->color = black; 48 else if (n->parent->color == black){//情況二 49 //無需任何處理 50 } 51 else if (getUncle(n)->color == red){//情況三 52 n->parent->color = black; 53 getUncle(n)->color = black; 54 n->parent->parent->color = red; 55 fix_color(n->parent->parent); 56 } 57 else { 58 if (n == n->parent->parent->left->right){// 頭兩個if是同時進行了情況四和情況五,這樣寫是因為旋轉操作次數不 59 left_rotate(n->parent); //一樣,各個節點的位置關系不一樣,不能把這兩個過程完全分開,看看后面的 60 right_rotate(n->parent); //顏色處理就會明白。 61 n->color = black; 62 n->left->color = red; 63 n->right->color = red; 64 } 65 else if (n == n->parent->parent->right->left){ 66 right_rotate(n->parent); 67 left_rotate(n->parent); 68 n->color = black; 69 n->left->color = red; 70 n->right->color = red; 71 } 72 else if (n == n->parent->parent->left->left){//這兩個if是沒有經過情況四直接進行情況五的時候。 73 right_rotate(n->parent->parent); 74 n->parent->color = black; 75 n->parent->left->color = red; 76 n->parent->right->color = red; 77 } 78 else { 79 left_rotate(n->parent->parent); 80 n->parent->color = black; 81 n->parent->left->color = red; 82 n->parent->right->color = red; 83 } 84 } 85 }

?

插入算法的特點: 1,旋轉操作不會超過兩次。 2,插入算法的遞歸次數不會大于此節點深度的二分之一。 3,插入算法的最壞時間復雜度為O(lgn) 以上就是插入的所有問題。 下面讓我們來看看刪除的時候會碰到的問題。 刪除操作 刪除算法比較復雜,我們來慢慢分析,請保持耐心。 首先當被刪除的節點M有兩個非NIL孩子的時候,我們會像二叉搜索樹那樣找M節點的(前驅/后繼)來代替M(代替M時,我們只是改變了M的key值,并沒有改變任何節點的顏色,所以沒有破壞紅黑樹的性質),然后刪除這個(前驅/后繼)(這時紅黑樹的性質可能被破壞),這時,我們刪除的這個(前驅/后繼)節點是只有一個非NIL孩子的,所以刪除有兩個非NIL孩子節點的問題可以當成刪除有一個非NIL孩子節點的問題。 那么接下來我們的討論都會針對最多只有一個非NIL孩子的節點 我們稱被刪除的節點為M,如果M有一個非NIL節點的孩子,那么我們叫這個節點C,如果M只有兩個NIL節點孩子,隨便選一個叫C就好。 情況一:M是紅節點時,此時M一定有兩個NIL節點的孩子(證明:考慮如果有一個非NIL節點的孩子C,那么C一定是黑色的,這時不管C節點后面都有什么節點,經過C節點的路徑的黑色節點的個數一定比到達M節點另一個孩子節點的路徑多,這時違反紅黑樹規定的,M為紅色時,只可能有兩個NIL孩子節點),此時我們只要用C節點替換M節點就行了。 情況二:M是黑色節點,且有一個紅色節點的孩子C,這時情況也很簡單,我們只需要刪掉M并用C節點代替它,再把C節點染成黑色就好了,從顏色上看,我們只是減少了一個紅色節點,不會破壞任何性質,從結構上看,我們成功刪除了M節點,達到了目的,也很好操作。
情況三:當M與C都是黑色節點時,情況就比較復雜了(這種情況只可能時M有兩個NIL孩子節點時,假設其中有一個是非NIL孩子節點那么它的子樹中一定有黑色節點,這就會導致不是每條路徑的黑色節點數相同,所以M與C都是黑色時只能是M有兩個NIL孩子節點時)這時我們先用任意一個M的孩子當做C節點來進行接下來的操作。
現在我們來確定在情況三下,若是刪除了M節點會有什么影響,由于我們用C節點代替了M節點,將M節點移除了,所以經過C節點的路徑會比沒有經過C節點的路徑少一個黑色節點所以只要我們想辦法把經過C節點的路徑的黑色節點數增加一個就可以了,那么現在我們來進行這個工作,第一步,我們先來做一下相關節點的命名區分。 我們定義當C節點替換完了M節點后,我們重新命名這個C節點為N節點(new的意思啦),N的兄弟節點命名為S(也就是原來M的父節點的另一個孩子),N的父節點為P(也就是之前M的父節點)。
下面我們就來討論情況三下,當節點呈現各種狀態的時候我們應該如何面對,在這里我們先假定N是p的左孩子(如果N是P的右孩子,下述相關操作的很多左與右的關系會替換,但是過程和思想是一樣的)。 經過前人的歸納,一共將這個修復的過程劃分成了6個狀態,每一次刪除M節點后我們都要對N進行這個六個狀態的依次檢查,規則如下。 開始:首先判斷是否符合狀態一的描述,符合則進入狀態一,不符合則跳過狀態一,判斷是否滿足狀態二,不滿足就跳過狀態二的描述,就根據狀態二的后續部分進行接下來的操作。

狀態一:

描述:N是根節點。

操作:什么都不用做了,因為樹空了。

???????? 影響:無。

???????? 后續:退出。

?

狀態二:

描述:S節點是紅色。

操作:將P和S的顏色交換,然后對P節點進行左旋(到此樹的結構還是沒有正常之后還要經過4,5 or 6,同樣接下來的操作還是通過N節點來定位)。

影響:

結構:因為進行了左旋所以有很多變化詳細請看圖。

顏色:各個路徑上的黑色節點數沒有變化,但是S(左旋后的位置)的左子樹的紅色節點多了一個,而右子樹的紅色節點少了一個。

后續:判定現在的狀態決定進入狀態三、四、五或者六中的一個。

?

狀態三:

描述:P、S、S的孩子都是黑色。

操作:我們直接把S染成紅色。

影響:

???????? 結構:無變化。

???????? 顏色:P的右子樹路徑上的黑色節點數少了一個,而紅色節點多了一個。

后續:這樣一來經過P節點的路徑就會比不經過P節點的路徑少一個黑色節點(P節點以下的顏色矛盾已經解決),P節點現在的處境和之前的N節點一模一樣,所以我們對P進行顏色的修正,進行遞歸調用。

?

?

狀態四:

描述:S和S的孩子是黑色的,但是P是紅的。

操作:那么我們就將S和P的顏色交。

影響:

結構:無變化

顏色:P的左子樹路徑黑色節點數量加一,P的右子樹路徑黑色節點數量不變

后續:狀態修復退出。

?

?

狀態五:

描述:S是黑色,S的左孩子是紅的,S的右孩子是黑的。

操作:我們對S進行右旋,然后交換S和他的新父節點的顏色。

影響:

結構:由于進行了右旋所以結構變化很大,請直接看圖。

顏色:就黑色節點而言沒有任何一條路徑有改變,但是,紅色節點的位置發生了變化,N節點現在有一個有紅色節點當右孩子的黑色兄弟。

后續:進入狀態六。

?

?

狀態六:

描述:S是黑色的,S的右節點是紅色的。

操作:對P進行左旋,然后交換P和S的顏色,并將S的右孩子變成黑色

影響:

結構:由于進行了左旋所以結構變化很大,請直接看圖。

顏色:S(左旋后)的右子樹路徑的黑色節點的數目不變,左子樹路徑的黑色節點增加了一個。

后續:狀態修復退出。

?

?

這樣來看的話我們一共有8條可能的路徑來修復(假設1-6代表進行狀態1-6對應的操作)

路徑:

1(問題解決)

3(解決局部問題,向上傳遞到狀態1)

2,4(問題解決)

2,5,6(問題解決)

2,6(問題解決)

4(問題解決)

5,6(問題解決)

6(問題解決)

?

然后讓我們來假設N是父節點的右孩子,那么那些操作和情況會發生變化呢?(下面說的不會變化指的是上面的文字描述不會有變化)

狀態一,不會有變化。

狀態二,對P節點的左旋會變成右旋,其他操作不變。

狀態三,不會有變化。

狀態四,不會有變化。

狀態五,S的左孩子是黑色,S的右孩子是紅色,對S進行左旋,其他不變。

狀態六,S的左節點是紅色,對P進行右旋,將S的左孩子染成黑色,其他不變。

?

所以我們在寫判定條件和操作的時候要記得把N是左右孩子的情況都考慮進去,我們綜合一下應該是下面這樣。在M與C都是黑色的情況下

狀態一:

描述:N是根節點。

操作:什么都不用做了,因為樹空了。

狀態二:

描述:S節點是紅色。

操作:將P和S的顏色交換,然后如果N是P的左孩子則對P節點進行左旋。

???????????????????????????????????????? 如果N是P的右孩子則對P節點進行右旋。

狀態三:

描述:P、S、S的孩子都是黑色。

操作:我們直接把S染成紅色。

狀態四:

描述:S和S的孩子是黑色的,但是P是紅的。

操作:那么我們就將S和P的顏色交。

狀態五:

描述:S是黑色,S的左孩子是紅的,S的右孩子是黑的,N是P的左孩子。

???????? 或者

???????? S是黑色,S的左孩子是黑的,S的右孩子是紅的,N是P的右孩子。

操作:N是P的左孩子我們對S進行右旋。

  ?? 或者

  ?? N是P的右孩子我們對S進行左旋。

???????? 然后交換S和他的新父節點的顏色。

狀態六:

描述:S是黑色的,S的右節點是紅色的,N是P的左孩子。

???????? 或者

??????? S是黑色的,S的左節點是紅色的,N是P的右孩子。

操作:N是P的左孩子我們對P進行左旋,然后交換P和S的顏色,并將S的右孩子變成黑色。

  ?? 或者

  ?? N是P的右孩子我們對P進行右旋,然后交換P和S的顏色,并將S的左孩子變成黑色。

????????

?

現在讓我們來集中解決一些常見問題。

問題一:情況三中S節點不會是NIL節點么?

答:不會,可以用假設法,假設S是NIL節點,那么為了保證每條路徑上的黑色節點數相同,那么M節點必須是NIL節點,如果M是非NIL節點,則一定會導致這個非NIL節點的路徑上的黑色節點數多于經過S節點的路徑,而M在情況三中并不是NIL節點,M的兩個孩子才是。

?

問題二:N節點是NIL節點,刪除算法中把它當做普通節點對待沒有問題么?

答:NIL節點和null值是不同的,NIL節點是一個空的節點,它也具有節點的結構,但是在這里NIL里有意義的數據只有color,其他的數據都是沒有意義的,所以只要算法結束后紅黑樹的結構維持不涉及NIL節點中color以外的屬性就沒有問題。(如果你想用null來代替NIL節點實現算法也是可以的,但是很多細節需要有相應的修改,博主覺得還是用NIL節點比較方便)。

?

現在讓我們來看代碼實現,為了使代碼更簡潔我們再寫兩個輔助函數

?Node* getSibling(Node* n);//返回n的兄弟節點?

?bool isParentLeftChild(Node* n);//判斷n是不是父節點的左孩子?

1 bool MyRBT::isParentLeftChild(Node* n){ 2 if (n->parent == nil){ 3 cout << "isParentLeftChild error" << endl; 4 exit(0); 5 } 6 if (n->parent->left == n) return true; 7 else return false; 8 } 9 10 Node* MyRBT::getSibling(Node* n){ 11 if (n->parent == nil||n==nullptr) return nil; 12 if (n->parent->left == n) 13 return n->parent->right; 14 else return n->parent->left; 15 }

?

因為刪除算法涉及到查找前驅和后繼,所以這個代碼也貼在這里

1 Node* MyRBT::findSuccessor(int k){ 2 return findSuccessor(findByKey(k)); 3 } 4 Node* MyRBT::findSuccessor(Node* n){ 5 if (n->right != nil){ 6 n = n->right; 7 while (n->left != nil) 8 n = n->left; 9 return n; 10 } 11 while (n->parent != nil&&n->parent->right == n) 12 n = n->parent; 13 return n->parent; 14 } 15 16 Node* MyRBT::findPredecessor(int k){ 17 return findPredecessor(findByKey(k)); 18 } 19 Node* MyRBT::findPredecessor(Node* n){ 20 if (n->left != nil){ 21 n = n->left; 22 while (n->right != nil) 23 n = n->right; 24 return n; 25 } 26 while (n->parent != nil&&n->parent->left == n) 27 n = n->parent; 28 return n->parent; 29 }

?

現在讓我們來看真正的刪除算法吧 1 void MyRBT::deleteNode(int k){ 2 deleteNode(findByKey(k)); 3 } 4 5 void MyRBT::deleteNode(Node* m){ 6 while(m->left != nil&&m->right != nil){//這個循環就是不斷的找前驅(找后繼也是可以的)來代替要被刪除的節點,直達某個前驅最多只有一個非NIL節點的孩子 7 Node* temp = findPredecessor(m); 8 m->key = temp->key; 9 m = temp; 10 } 11 if (m->color == red) //情況一 12 parentToN(m) = nil; 13 else if (m->left->color == red || m->right->color == red){//情況二 14 if (m->left != nil){ 15 m->left->parent = m->parent; 16 parentToN(m) = m->left; 17 m->left->color = black; 18 } 19 else{ 20 m->right->parent = m->parent; 21 parentToN(m) = m->right; 22 m->right->color = black; 23 } 24 } 25 else delete_fix_color(m);//進入最復雜的情況三 26 delete m;//處理完釋放被刪除的節點的空間 27 return; 28 } 29 30 void MyRBT::delete_fix_color(Node* n){ 31 Node* s = getSibling(n); 32 Node* p = n->parent; 33 parentToN(n) = nil; 34 nil->parent = n->parent; 35 n = nil; 36 if (n->parent == nil){//狀態一 37 //什么都不用做 38 } 39 else if (p->color == black&&s->color == black&&s->left->color == black&&s->right->color == black){//狀態三 40 s->color = red; 41 delete_fix_color(p); 42 } 43 else { 44 if (s->color == red){//狀態二 45 s->color = black; 46 p->color = red; 47 if (isParentLeftChild(n)) left_rotate(p); 48 else right_rotate(p); 49 } 50 if (s->color == black&&s->left->color == black&&s->right->color == black&&p->color == red){//狀態四 51 s->color = red; 52 p->color = black; 53 return; 54 } 55 else{//狀態五 56 if (s->color == black&&s->left->color == red&&s->right->color == black&&isParentLeftChild(n)){ 57 right_rotate(s); 58 s->color = red; 59 s->parent->color = black; 60 } 61 else if (s->color == black&&s->left->color == black&&s->right->color == red && (!isParentLeftChild(n))){ 62 left_rotate(s); 63 s->color = red; 64 s->parent->color = black; 65 } 66 //狀態六 67 if (s->color == black&&s->right->color == red&&isParentLeftChild(n)){ 68 left_rotate(p); 69 s->color = p->color; 70 p->color = black; 71 s->right->color = black; 72 } 73 else if (s->color == black&&s->left->color == red && (!isParentLeftChild(n))){ 74 right_rotate(p); 75 s->color = p->color; 76 p->color = black; 77 s->left->color = black; 78 } 79 } 80 } 81 }

?

刪除算法的特點: 1,旋轉操作不會超過三次。 2,插入算法的遞歸次數不會大于此節點的深度。 3,插入算法的最壞時間復雜度為O(lgn)

刪除操作到此結束。

?

其他操作只讀操作的代碼我也貼在這里,供大家參考(詳細的說明請參考二叉搜索樹那一篇) 構造方法 1 MyRBT::MyRBT(vector<int> v):MyRBT(){ 2 for (auto n : v){ 3 insertNode(n); 4 } 5 }

通過key值查找特定節點

1 Node* MyRBT::findByKey(int k){ 2 Node* temp = root; 3 while (temp != nil){ 4 if (k == temp->key) 5 return temp; 6 temp = k < temp->key ? temp->left : temp->right; 7 } 8 cout << "can't find" << endl; 9 return nullptr; 10 }

遍歷算法

1 void MyRBT::traversal(Node* root, void(*f)(int k)){ 2 if (root==nil)//當樹為空的時候root為nullptr 3 return; 4 traversal(root->left); 5 cout << root->key << " " << root->color << endl; 6 traversal(root->right); 7 }

?

終于寫完了,撒花???,好長啊= =,如果覺得還是不夠清楚可以看看wiki百科上的解釋,鏈接在參考資料里,講的很好,一定要看英文的,中文版的翻譯的不全,省略了很多說明性的東西,反而更難懂了_(:зゝ∠)_。 祝各位學習愉快?(^?^*)~~~~。

參考資料:

1,《算法導論 中文版》(英文版第三版)(美)ThomasH.Cormen,CharlesE.Leiserson,RonaldL.Rivest,CliffordStein 著;王剛,鄒恒明,殷建平,王宏志等譯。

2,WIKI百科https://en.wikipedia.org/wiki/Red%E2%80%93black_tree

轉載于:https://www.cnblogs.com/coffeeSS/p/5447929.html

總結

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

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

亚洲黄色一级电影 | 国产原创在线观看 | 久久dvd | 在线 视频 一区二区 | 国产天天综合 | 国产高清在线 | 精品美女久久久久 | 国产精品私人影院 | 免费日韩三级 | 免费成人黄色片 | 精品免费视频123区 午夜久久成人 | 在线观看av大片 | 欧美色图另类 | 国产精品久久久久影院日本 | 中文字幕在线观看完整版 | 免费成人av在线看 | 久久视频这里有精品 | 亚洲日本va午夜在线电影 | 免费av免费观看 | 久久综合免费视频 | 伊人久在线 | 毛片黄色一级 | 97精品国产aⅴ | 日夜夜精品视频 | 免费精品视频在线 | 久久国产精品免费看 | 亚洲精品欧美精品 | 中文乱码视频在线观看 | 香蕉91视频 | 欧美精品视 | 一区二区精品在线观看 | 丁香激情五月 | 天天弄天天操 | 91.dizhi永久地址最新 | 操操操人人 | 成人黄色免费在线观看 | 久操久| 成人精品影视 | 亚洲视频每日更新 | 天天做天天爱夜夜爽 | 91精品视频在线 | 亚洲日本欧美在线 | 日韩av一区二区三区四区 | 精品一区二区在线免费观看 | 18性欧美xxxⅹ性满足 | 在线播放 亚洲 | 国产短视频在线播放 | 精品福利国产 | 成人毛片a | 五月天婷婷狠狠 | 国产黄色av网站 | 九九久久久久久久久激情 | 国产精品国内免费一区二区三区 | 亚洲欧洲精品一区二区 | 免费欧美精品 | 亚洲妇女av| 国产福利一区二区在线 | 就要色综合 | 天天天天色射综合 | 天天操夜操视频 | 亚洲精品午夜久久久 | 国产麻豆精品95视频 | 日本xxxx.com| 天天干天天搞天天射 | 国产1区2区3区在线 亚洲自拍偷拍色图 | 日韩欧美精选 | 一区二区三区在线免费观看视频 | 99色亚洲| 超碰在线观看99 | 国产精品久久嫩一区二区免费 | 日韩精品影视 | 国产 一区二区三区 在线 | 一级黄色片在线免费看 | 久久免费播放视频 | 色的网站在线观看 | 亚洲三级在线播放 | 日韩精品视频在线观看网址 | 91片黄在线观看动漫 | 国产成人a亚洲精品v | 国产成人黄色网址 | 免费特级黄毛片 | 免费精品视频 | 欧美二区三区91 | 在线日韩中文 | 国内视频在线 | 在线观看不卡的av | 天堂av在线网 | 国产成人精品网站 | 色综合夜色一区 | 国产一区二区三区视频在线 | 九九九热精品免费视频观看 | 国产五月 | 天天鲁一鲁摸一摸爽一爽 | 天天干人人 | 日韩在线观 | 久久人人爽人人 | 中文字幕在线观看日本 | 国产精品免费视频一区二区 | 中文字幕在线有码 | 豆豆色资源网xfplay | 91成人亚洲 | 在线观看中文字幕第一页 | 亚洲人成综合 | 91福利视频网站 | 久久久久久久影院 | 特级毛片爽www免费版 | 91成人免费视频 | 99精品视频网站 | 日韩av中文在线观看 | 99热超碰 | 国产一区二区三区在线 | 免费在线中文字幕 | 四月婷婷在线观看 | 五月天精品视频 | 91精品爽啪蜜夜国产在线播放 | 欧美a级在线 | 99电影456麻豆 | 日韩免费视频一区二区 | 国产一区二区在线播放视频 | 99tvdz@gmail.com| 99精品一级欧美片免费播放 | 99精品黄色片免费大全 | 在线观看你懂的网址 | 激情亚洲综合在线 | 婷婷在线视频 | 最新中文字幕在线播放 | 欧美电影在线观看 | 日本 在线 视频 中文 有码 | 日韩欧美一区二区三区免费观看 | 日本精品中文字幕 | 日韩二区三区 | 国产资源在线播放 | 亚洲伊人网在线观看 | 国产福利久久 | 欧美视频在线二区 | 欧美精品一区二区性色 | 青青草国产免费 | 久久久久国产免费免费 | 成人综合日日夜夜 | 六月激情久久 | 69视频永久免费观看 | av在线免费不卡 | www.888av| 国产精品久久久久久久久久久久冷 | 亚洲欧洲一级 | 天天插天天射 | 日本在线中文在线 | 欧美日韩精品影院 | 深爱婷婷 | 国产999精品视频 | 日韩电影中文字幕在线 | 天天久久综合 | 成在线播放 | 99视屏| 日韩素人在线观看 | 天堂在线一区二区 | 福利片免费看 | 天天鲁一鲁摸一摸爽一爽 | 91精品视频在线免费观看 | 久久经典国产 | av网站免费线看精品 | 97超碰国产精品 | 久久久久久久久久久国产精品 | 91亚色视频在线观看 | 久久免费国产精品1 | 日韩在线观看视频免费 | 毛片网站免费在线观看 | 欧美精品v国产精品v日韩精品 | 99久久精品一区二区成人 | 91免费版成人 | 日韩黄色免费在线观看 | 在线看片视频 | 色综合天天视频在线观看 | 国产一区二区三区网站 | 久久精品小视频 | 国产精品原创视频 | 五月香视频在线观看 | 99免费在线 | 粉嫩av一区二区三区四区在线观看 | 欧美日韩亚洲精品在线 | 天天色天天骑天天射 | 97精品国产97久久久久久春色 | 久久久久久久久免费视频 | 黄色av大片 | 97超视频免费观看 | 久久美女视频 | 在线播放亚洲激情 | 2019国产精品 | 精品一区二区三区久久 | 久久av在线播放 | 欧美人牲 | 欧美精品视 | 一区二区三区免费看 | 国产一区欧美二区 | 国产韩国日本高清视频 | 丁香伊人网 | 久久综合给合久久狠狠色 | 青青久草在线 | 国产一区二区三区四区在线 | 玖玖视频在线 | 国产专区欧美专区 | 中文字幕在线观看免费高清电影 | 中文字幕免费观看视频 | 视频在线观看入口黄最新永久免费国产 | 天天插狠狠插 | 午夜一级免费电影 | 一区二区中文字幕在线播放 | 丁香六月色 | 五月天激情电影 | 国产91精品看黄网站 | 日本久久片 | 欧美日韩一区二区免费在线观看 | 日韩在线视频一区 | 免费麻豆网站 | 亚洲男模gay裸体gay | 激情五月婷婷激情 | 91亚洲精品久久久久图片蜜桃 | av超碰在线观看 | 欧美日韩免费一区二区 | av三级av| 国产精品白丝jk白祙 | 国产精品入口传媒 | 97夜夜澡人人双人人人喊 | 久久视频精品在线观看 | 日韩网站在线播放 | 久久亚洲综合国产精品99麻豆的功能介绍 | a级一a一级在线观看 | 亚洲 欧美变态 另类 综合 | 日韩久久精品一区二区 | 久久国产精品一区二区三区 | 国产爽妇网| 久久五月天婷婷 | 国模一二三区 | 十八岁以下禁止观看的1000个网站 | 高潮久久久| 深夜免费网站 | 欧美成人影音 | 五月香视频在线观看 | av电影一区 | 国产91精品一区二区麻豆亚洲 | 99热在线观看 | 成人免费视频播放 | 狠狠色丁香婷婷 | 最近高清中文字幕在线国语5 | 国产韩国日本高清视频 | 精品国产乱码久久久久久三级人 | 国产精品久久久久久久久久久久午夜 | 97在线看| 国产精品久久一区二区三区, | 国产精品国产三级在线专区 | 99久久精品国产网站 | 欧美三人交 | 有码中文字幕在线观看 | 九九爱免费视频在线观看 | 日韩av中文在线 | 国产一二区视频 | 午夜视频免费 | 欧美,日韩| 免费黄色av片 | 亚洲精品免费在线 | 狠狠干网址 | 国产高清久久 | 国产99久久久精品视频 | 你操综合| 伊色综合久久之综合久久 | 欧美精品色 | 五月婷婷激情六月 | wwxxxx日本| 在线v| 91天天操 | 日免费视频 | 久久伊人五月天 | 99久久精品免费看国产一区二区三区 | 九九热精品国产 | 操碰av | 天堂va在线观看 | 国内丰满少妇猛烈精品播放 | 久久人人爽人人 | 天天要夜夜操 | 亚洲欧洲成人精品av97 | 一区二区三区中文字幕在线 | 欧美日韩高清在线观看 | 二区三区在线视频 | 五月天电影免费在线观看一区 | 久久草在线免费 | 97超碰在| 国产玖玖视频 | 亚洲热视频 | ,午夜性刺激免费看视频 | 97麻豆视频 | 国产精品黄色在线观看 | 中文字幕在线观看的网站 | 狠狠的操 | 久久露脸国产精品 | japanese黑人亚洲人4k | 婷婷丁香国产 | 麻豆一精品传二传媒短视频 | 国产毛片在线 | 精品久久一级片 | 精品国产免费久久 | av在线播放国产 | 四虎影院在线观看av | 日韩在线在线 | 日本护士三级少妇三级999 | 国产女人免费看a级丨片 | 日本少妇久久久 | 欧美性天天 | 成人免费观看视频大全 | 精品国产乱码久久久久久天美 | 中文字幕人成人 | 91桃色在线观看视频 | 国产一区二区中文字幕 | 久久99精品久久久久婷婷 | 久久免费av电影 | 综合av在线| 最新91在线视频 | 黄色三级视频片 | 国产精品久久久久久麻豆一区 | 日日爱影视 | 色综合激情网 | 色综合婷婷久久 | 欧美另类一二三四区 | 亚洲三级黄 | 亚洲天堂网站 | 天天射天天艹 | 久久婷婷一区 | 欧美日韩视频在线 | 免费一级特黄录像 | 欧美激情综合色综合啪啪五月 | 日本黄区免费视频观看 | 国产xx在线 | 天堂视频一区 | 综合精品久久久 | 一区二区中文字幕在线观看 | 91九色porny蝌蚪视频 | 激情欧美xxxx | 久久99这里只有精品 | 狠狠躁夜夜躁人人爽超碰97香蕉 | 一区二区欧美激情 | 欧美激情第八页 | 久久精品www人人爽人人 | 成 人 免费 黄 色 视频 | 成年人在线免费看视频 | 国产在线久草 | 99精品视频精品精品视频 | 成在人线av | 国语自产偷拍精品视频偷 | 夜夜操天天干 | 91久久黄色| 麻豆久久久久 | 射射射综合网 | 国产麻豆精品在线观看 | 日韩av网页| 国产黄色特级片 | 久久精品国产精品亚洲精品 | 成人在线黄色电影 | 成年人视频在线免费观看 | 欧美国产不卡 | 手机看片国产 | 中文字幕激情 | 丁香5月婷婷 | 国产无遮挡又黄又爽馒头漫画 | 久久精品视频在线观看 | 精品色999 | 久久伊人操 | 色综合久久久久综合体桃花网 | 色噜噜狠狠色综合中国 | 国产xvideos免费视频播放 | 91高清免费在线观看 | 波多野结衣亚洲一区二区 | 欧美九九九 | 波多野结衣在线观看一区 | 一区二区三区精品久久久 | 国产精品久久久久免费a∨ 欧美一级性生活片 | 亚洲国产高清在线观看视频 | 久久久免费精品视频 | 香蕉网在线播放 | 久久精品视频在线观看免费 | 日韩美在线 | 九九热精品视频在线观看 | 天天操夜夜操国产精品 | 国产aaa免费视频 | 精品久久久久久久久中文字幕 | 91九色最新 | 中文字幕在线日 | 日日爽夜夜爽 | 久久久久久久久久久精 | 午夜色大片在线观看 | 麻豆影视在线免费观看 | 久久精品高清 | 国产精品青青 | 成在线播放 | 欧美日韩在线视频观看 | 国产精品a级 | 亚洲一区二区观看 | 超碰在线日本 | 99草在线视频 | 国产一在线精品一区在线观看 | 国产999精品久久久久久绿帽 | 免费美女久久99 | 蜜桃av人人夜夜澡人人爽 | 日韩伦理片hd | 久草免费在线视频 | 亚洲精品视频中文字幕 | 国产手机av在线 | 91视频免费网址 | 日日干天天插 | 久久久久激情电影 | a级国产乱理伦片在线播放 久久久久国产精品一区 | 日日夜夜狠狠干 | 亚洲精品成人在线 | 国产小视频免费观看 | 天天操比| 天天射天天射 | a级成人毛片 | 2019中文在线观看 | 国产精品黄色影片导航在线观看 | 天天干天天看 | 国产色就色| 中文永久字幕 | 在线亚洲人成电影网站色www | 国产成人一区二区啪在线观看 | 日韩在线视 | 在线观看免费观看在线91 | 久久www免费人成看片高清 | 日韩欧美一区二区不卡 | 亚洲精品网站 | www.夜夜操.com| 亚洲精品88欧美一区二区 | 成人91在线| 久久在线免费观看视频 | 高清久久久 | 欧洲精品二区 | 天天看天天干天天操 | 国产精品成 | 91在线网站| 欧美性猛片, | 天天综合五月天 | 热久久国产 | 国产精品视频免费看 | 国产精品久99 | 91粉色视频 | 成人免费看视频 | 日韩在线视频观看 | a级片久久 | 久久少妇 | 黄色视屏免费在线观看 | 欧美日韩伦理一区 | 91精品少妇偷拍99 | 久久国产热视频 | 中文字幕在线观看视频网站 | 久久欧美综合 | 悠悠av资源片 | 国色综合 | av网站在线观看免费 | 免费观看91视频 | 六月色婷| 99精品在这里 | 国产v在线观看 | 国产成人精品一区二区三区免费 | 国产精品久久久久影视 | 伊人成人久久 | 日韩欧美高清不卡 | 二区三区精品 | 激情中文在线 | 国产精品 欧美 日韩 | 亚洲精品国产综合99久久夜夜嗨 | 日韩欧美在线综合网 | 国模精品一区二区三区 | 色狠狠一区二区 | 午夜精品一区二区三区在线观看 | 婷婷综合影院 | 青青草国产成人99久久 | 中文字幕精品三区 | 天天天色综合a | 中文免费观看 | 中文字幕免费高 | 美女视频黄免费网站 | 成年人免费在线看 | 欧美日韩免费观看一区=区三区 | 在线黄色国产电影 | 成人在线视频在线观看 | av片无限看| 亚洲 欧美 综合 在线 精品 | 国产视频每日更新 | 在线视频中文字幕一区 | 丁香影院在线 | 免费av看片| 精品免费视频123区 午夜久久成人 | av东方在线 | 欧美另类z0zx | 国产精品你懂的在线观看 | 国产精品久久久久久婷婷天堂 | 中文字幕日韩伦理 | 欧美91视频 | 天天超碰 | 三级午夜片| 91精品国产自产在线观看 | 色综合亚洲精品激情狠狠 | 免费黄色小网站 | 日韩大片免费观看 | 五月婷婷毛片 | 麻豆视频网址 | 亚洲欧美国产日韩在线观看 | 美女在线免费视频 | 久久99免费观看 | 国产亚洲综合精品 | 欧美另类v| 亚洲精品乱码久久久久久蜜桃欧美 | 亚洲理论视频 | aaa日本高清在线播放免费观看 | 激情综合电影网 | 天天插天天操天天干 | 免费在线观看日韩视频 | 精品99在线视频 | 国产网站色 | 美女国内精品自产拍在线播放 | 亚洲日本激情 | japanesexxxhd奶水 91在线精品一区二区 | 国产色影院| 国产色视频网站 | 成人理论电影 | 九九色视频 | 最近中文国产在线视频 | 国产最新在线 | 欧美精品天堂 | 一区二区精品久久 | 成人国产精品一区 | 在线视频精品播放 | 久草网在线 | 久久精品—区二区三区 | 亚洲欧美日本A∨在线观看 青青河边草观看完整版高清 | 日韩首页| 亚洲人成网站精品片在线观看 | 97天天综合网 | 国产福利91精品一区 | 久久色中文字幕 | 国产69精品久久久久久 | 在线观看亚洲a | 国产精品色 | 欧美成人久久 | 久久成人午夜视频 | 精品视频亚洲 | 免费成人在线网站 | 二区三区在线 | 91免费网站在线观看 | 黄色av成人在线观看 | 亚洲视频在线视频 | 黄色av成人在线 | 99精品国产一区二区 | 欧美性猛片, | 久久久久欠精品国产毛片国产毛生 | av日韩不卡 | 国产91丝袜在线播放动漫 | 久久成人国产精品入口 | 成人在线中文字幕 | 午夜久久成人 | 最新中文字幕在线播放 | 国产精美视频 | 在线中文字幕网站 | 国产又粗又猛又爽又黄的视频免费 | 久九视频 | 在线观看日韩精品 | 国产成a人亚洲精v品在线观看 | 日韩三级视频在线看 | 久久久久国产成人精品亚洲午夜 | 国产黄a三级 | 成av在线 | 国产一级一片免费播放放 | 国产久草在线观看 | 天天干,天天射,天天操,天天摸 | 一级黄色片在线观看 | 国产麻豆剧传媒免费观看 | 欧美精品免费在线观看 | 国产高清免费 | 久久久久久久久久免费 | 欧美另类一二三四区 | 日本黄色黄网站 | 91香蕉视频污在线 | 欧美一区二区三区不卡 | 日本视频精品 | 欧美俄罗斯性视频 | 制服丝袜亚洲 | 国产精品日韩高清 | 91天天操 | 中文字幕免费观看 | 国产精品麻豆99久久久久久 | 亚洲成人资源 | 天天干,天天操 | 久久精品美女视频 | 在线观看理论 | 天天精品视频 | 亚洲黄色成人网 | 欧美久久久久久久 | 国产精品国内免费一区二区三区 | 欧美日韩国产一二三区 | 亚洲视频2| 久久国产精品免费视频 | 亚洲 中文 欧美 日韩vr 在线 | 免费久久视频 | av观看免费在线 | 波多野结衣视频一区二区三区 | 国产亚洲在线观看 | 粉嫩av一区二区三区入口 | 久草在线99 | 国产剧情在线一区 | 亚洲精品tv久久久久久久久久 | 亚洲丝袜一区二区 | 精品久久久久久久久久 | 天天草av| 激情婷婷综合 | 国产精品毛片完整版 | 三级黄色在线观看 | 91精品成人 | 欧美va天堂va视频va在线 | 99在线观看免费视频精品观看 | 色网站在线免费观看 | 黄网站色欧美视频 | 久亚洲 | 精品在线观看一区二区三区 | 成人蜜桃视频 | 国产成人精品在线 | 91日韩在线播放 | 国产精品免费在线播放 | 久久综合九色综合97_ 久久久 | 色综合久久88 | 日韩欧美国产精品 | 色com网 | 国产区在线看 | 91视频免费看 | 超碰在线最新网址 | 九九九九色 | 久久这里只有精品1 | 一区二区三区不卡在线 | 日韩中文字幕在线观看 | 精品一区二区三区久久久 | 亚洲伊人婷婷 | 国产午夜小视频 | 国产在线综合视频 | 久久国产亚洲精品 | www国产亚洲精品 | 亚洲 综合 专区 | 午夜色场| 911久久香蕉国产线看观看 | 91av观看| 国产一区自拍视频 | 成年人在线观看免费视频 | 久久人91精品久久久久久不卡 | 人人射人人射 | av在线超碰| 亚洲一区欧美精品 | 偷拍福利视频一区二区三区 | 欧美激情视频一区二区三区免费 | 欧美日韩一级久久久久久免费看 | 欧美一级久久久久 | 久久天天躁夜夜躁狠狠躁2022 | 三级免费黄 | 99精品电影 | 久久免费视屏 | 激情视频91 | 国产在线一区二区 | 超碰资源在线 | 亚洲精品在线资源 | 伊人天天干| 97成人精品视频在线播放 | 你操综合| 欧美日韩精品久久久 | 久久精品亚洲一区二区三区观看模式 | 91精品国产麻豆国产自产影视 | 久久你懂的 | 天天爱天天舔 | 亚洲另类xxxx | 日韩免费观看一区二区三区 | 久久精品视频免费观看 | 一本一本久久a久久 | 国产护士av| www五月天 | 欧美不卡视频在线 | 四虎影视4hu4虎成人 | 免费视频 三区 | 天天色天天射天天干 | 欧美激情另类 | 天天色天天操综合 | 日本中文在线播放 | 亚洲另类人人澡 | 日韩高清毛片 | 久久免费av | 国产91全国探花系列在线播放 | 国产精品剧情在线亚洲 | 国产美女网站在线观看 | 欧美激情精品 | 日日干干 | 天天操夜夜操夜夜操 | 中文字幕免费一区二区 | 日韩色一区二区三区 | 国产亚洲成人网 | 久久国产精品影片 | 久久精品国产精品亚洲 | 久久久国产一区二区 | 免费视频久久久 | 一区二区不卡视频在线观看 | 国产精品毛片久久 | 香蕉在线观看视频 | 成人av网站在线播放 | 高清av影院 | 亚洲乱码精品久久久久 | 在线一二区 | 五月天国产 | www.久久色.com | 在线你懂 | 韩日三级在线 | 99久久这里有精品 | 欧美在线99| 国产又黄又硬又爽 | 狠狠精品| 黄色在线免费观看网站 | 麻豆视频免费在线观看 | 成年人视频免费在线播放 | 日韩二级毛片 | 99精品小视频 | 欧美一性一交一乱 | 国产精品爽爽爽 | 久久久久久久久国产 | 免费观看一区二区 | 色婷婷av一区 | 欧美日韩久久久 | 国产在线精品一区二区三区 | 免费a v观看 | 日本特黄一级 | 超碰在线94| 国产中文字幕三区 | 98久9在线 | 免费 | 久久永久免费视频 | 成人av一区二区在线观看 | 欧美日韩亚洲第一页 | 毛片网在线播放 | 丰满少妇在线观看 | 久久这里只有精品首页 | 国产麻豆剧果冻传媒视频播放量 | 男女拍拍免费视频 | 国产在线观看99 | 国产中文在线字幕 | 久久精品久久久久电影 | 亚洲va欧美va国产va黑人 | 国产一级二级三级视频 | www.五月婷 | 最近日本mv字幕免费观看 | 国产精品一二三 | 久久成人资源 | 免费a现在观看 | 91免费版在线 | 久草视频在线免费播放 | 伊人资源视频在线 | 久久久精品视频成人 | 国产精品麻| 最近中文字幕mv免费高清在线 | 99精品国产福利在线观看免费 | 久草久视频 | 亚洲一片黄 | 免费成人短视频 | 国产精品久久久久久久久费观看 | 特黄一级毛片 | 丁香婷婷激情网 | 久久久午夜精品理论片中文字幕 | 亚洲激情视频在线观看 | 超碰在线官网 | 亚洲精品午夜aaa久久久 | 欧美日韩精品网站 | 麻花豆传媒一二三产区 | 成人性生交大片免费观看网站 | 色黄www小说| 成年人免费在线观看 | 天天射天天搞 | 国产精品一区二区视频 | 黄色三级在线观看 | 五月开心激情 | 黄色av高清 | 青青河边草免费观看完整版高清 | 麻花天美星空视频 | 日批网站免费观看 | 久久久黄色av | 日韩成人邪恶影片 | 亚洲 欧洲 国产 精品 | 欧美日韩一区二区在线 | 中文字幕国产 | 一级免费黄色 | 国产九九精品视频 | 欧美性超爽 | 国产视频在线观看一区 | 欧美淫视频 | 精品国产伦一区二区三区观看体验 | 在线国产精品一区 | 中文字幕在线播放视频 | 黄色av网站在线观看免费 | 国内精品久久久久久久久 | 亚洲尺码电影av久久 | 亚洲精品美女久久久久 | 久草精品视频在线看网站免费 | 97碰碰视频| 国产又粗又猛又色又黄视频 | 又湿又紧又大又爽a视频国产 | 美女免费电影 | 日韩免费专区 | 免费午夜视频在线观看 | 日p在线观看| 日日日操 | 97日日碰人人模人人澡分享吧 | 色婷婷国产在线 | 91豆花在线观看 | 亚洲精品高清视频 | 国产中出在线观看 | 久久性生活片 | 激情小说 五月 | 欧美日韩精品二区第二页 | 在线观看韩国av | 亚洲精品视频播放 | 麻豆传媒电影在线观看 | aaa免费毛片 | 狠狠色噜噜狠狠狠狠 | 国产97色 | 免费看片网址 | 九九久久免费 | 亚洲精品在线国产 | 国产护士hd高朝护士1 | 久久99热国产 | 人人搞人人干 | 午夜视频在线观看一区二区三区 | 亚洲成人精品在线 | 视频一区二区免费 | 欧美午夜性生活 | 九九热免费视频在线观看 | 日本中文字幕在线电影 | 久插视频 | 丁香婷婷基地 | 国产一级特黄电影 | 91在线免费公开视频 | 天天干,天天草 | 91精品国自产在线 | 久久久免费精品国产一区二区 | 男女视频久久久 | 99视| 国产精品成人a免费观看 | 久产久精国产品 | 久久影院精品 | 欧美一级视频免费看 | 亚洲国产高清视频 | 国产白浆在线观看 | 全久久久久久久久久久电影 | 久久a免费视频 | 在线视频中文字幕一区 | 欧美性生活大片 | 高清一区二区三区 | 九色视频网站 | 国产黄大片 | 在线视频 影院 | 韩国一区二区av | 黄色一级大片在线免费看国产一 | 天天草av| 丝袜美腿av | 在线观看aaa | 国产亚洲精品久久久久久网站 | 午夜精品久久久久久久久久久久久久 | 在线观影网站 | 青青看片| 91福利试看 | 成人精品视频久久久久 | 日韩三级视频在线观看 | 日韩理论片在线 | 日韩无在线 | 久久1区 | 在线观看黄色小视频 | 精品久久一区二区三区 | 久久久婷| 欧美一区日韩一区 | 在线观看国产v片 | 麻豆传媒视频在线播放 | 欧美小视频在线 | 久久精品—区二区三区 | 国产蜜臀av| 亚洲成人av在线电影 | 国产精品久久久久久久久毛片 | 亚洲黄色免费 | 欧美日韩不卡在线视频 | 亚洲伊人成综合网 | 国产精品精品久久久 | 亚洲欧美国产日韩在线观看 | 色欧美视频 | av电影在线观看 | 国产精品一区二区三区久久 | 国产一区影院 | 深爱激情婷婷网 | av资源网在线播放 | 欧美日韩视频在线一区 | 奇米网444 | 欧美一区日韩精品 | 成人av影视观看 | 亚洲激情免费 | 美女一级毛片视频 | 国产免费av一区二区三区 | av电影在线观看完整版一区二区 | 日日日爽爽爽 | 色狠狠狠 | 国产视频一二区 | 黄a在线看 | 97天天综合网 | 色网站在线免费观看 | 国产精品一区二区三区99 | 精品国产一区二区三区久久 | 日韩区欧美久久久无人区 | 免费网站在线观看成人 | 亚洲欧美va | 亚洲综合网 | av黄色影院| 成人黄色在线电影 | 97精品国产97久久久久久粉红 | 久久久久久久电影 | 视频高清 | 久草电影网 | 亚洲精品在 | av中文字幕日韩 | 在线观看国产日韩欧美 | 黄色av影视 | av中文字幕第一页 | 免费试看一区 | 在线观看完整版免费 | 欧美精品久久久久久久久久久 | 精品自拍网 | www.天天干.com | 亚洲劲爆av| 日韩精品欧美专区 | 亚洲最新视频在线播放 | 韩日精品在线观看 | 国产视频精品免费 | 国产日韩欧美在线观看视频 | 精品一区二区日韩 | 日韩欧美在线观看一区二区 | 久久免费黄色 | 国产二区精品 | 欧美激情综合五月色丁香小说 | 日本精品视频在线播放 | 国产一级视频免费看 | 欧美国产日韩中文 | 超碰在线最新地址 | 国产精品久久久久9999 | 免费av黄色 | 欧美大片在线观看一区 | 国产精品久久久久久久久毛片 | www.五月天激情 | 国产 中文 日韩 欧美 | 在线 你懂 | 免费网站污 | 国产精品永久免费视频 | 激情综合啪 | av成人在线网站 | 亚洲天堂网站 | 欧美aa一级片 | 欧美日韩在线播放一区 | 99re中文字幕 | 成人福利在线观看 | 日韩一级黄色av | 亚洲干| 久久久久国产a免费观看rela | 日韩色综合网 | 中文字幕免费国产精品 | 国产精品黄色影片导航在线观看 | 精品免费99久久 | 六月丁香婷婷久久 | 国产探花在线看 | 在线免费观看不卡av | 亚洲狠狠操 | 伊人电影天堂 | 在线国产91 | 国色天香在线观看 | 欧洲在线免费视频 | 91欧美日韩国产 | 国产男女免费完整视频 | 久久久毛片 | 97超碰在线资源 | 日本视频精品 | 亚洲精品动漫在线 | 男女全黄一级一级高潮免费看 | 午夜精品久久久久 | 免费视频99 | 久久九九影视网 | 天天操天天干天天操天天干 | 免费观看一级 | 91九色国产 | 91热在线 | 美女黄视频免费看 | 91视频 - 114av| 综合网天天色 | av线上看 | 成人欧美一区二区三区在线观看 | 日本中文字幕视频 | 狠狠干综合网 | 国产亚洲精品久久久久5区 成人h电影在线观看 | 午夜视频在线观看欧美 | 免费三级大片 |