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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

深入浅出!二叉树详解,包含C语言代码

發布時間:2024/3/13 编程问答 53 豆豆
生活随笔 收集整理的這篇文章主要介紹了 深入浅出!二叉树详解,包含C语言代码 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

導讀】:樹是數據結構中的重中之重,尤其以各類二叉樹為學習的難點。在考研中,二叉樹也是常考的模塊。本文主要講二叉樹操作的相關知識。請大家跟隨小編一起來復習吧。

本篇針對面試中常見的二叉樹操作作個總結:

  • 前序遍歷,中序遍歷,后序遍歷;

  • 層次遍歷;

  • 求樹的結點數;

  • 求樹的葉子數;

  • 求樹的深度;

  • 求二叉樹第k層的結點個數;

  • 判斷兩棵二叉樹是否結構相同;

  • 求二叉樹的鏡像;

  • 求兩個結點的最低公共祖先結點;

  • 求任意兩結點距離;

  • 找出二叉樹中某個結點的所有祖先結點;

  • 不使用遞歸和棧遍歷二叉樹;

  • 二叉樹前序中序推后序;

  • 判斷二叉樹是不是完全二叉樹;

  • 判斷是否是二叉查找樹的后序遍歷結果;

  • 給定一個二叉查找樹中的結點,找出在中序遍歷下它的后繼和前驅;

  • 二分查找樹轉化為排序的循環雙鏈表;

  • 有序鏈表轉化為平衡的二分查找樹;

  • 判斷是否是二叉查找樹。

  • 1 前序遍歷,中序遍歷,后序遍歷;

    1.1 前序遍歷

    對于當前結點,先輸出該結點,然后輸出它的左孩子,最后輸出它的右孩子。以上圖為例,遞歸的過程如下:

  • 輸出 1,接著左孩子;

  • 輸出 2,接著左孩子;

  • 輸出 4,左孩子為空,再接著右孩子;

  • 輸出 6,左孩子為空,再接著右孩子;

  • 輸出 7,左右孩子都為空,此時 2 的左子樹全部輸出,2 的右子樹為空,此時 1 的左子樹全部輸出,接著 1 的右子樹;

  • 輸出 3,接著左孩子;

  • 輸出 5,左右孩子為空,此時 3 的左子樹全部輸出,3 的右子樹為空,至此 1 的右子樹全部輸出,結束。

  • 而非遞歸版本只是利用 stack 模擬上述過程而已,遞歸的過程也就是出入棧的過程。

    /*?前序遍歷遞歸版?*/ void?PreOrderRec(Node?*?node) {if?(node?==?nullptr)return;cout?<<?node->data?<<?"?";???//?先輸出當前結點???PreOrderRec(node->left);?????//?然后輸出左孩子PreOrderRec(node->right);????//?最后輸出右孩子 }/*?前序遍歷非遞歸版?*/ void?PreOrderNonRec(Node?*?node) {if?(node?==?nullptr)return;stack<Node*>?S;cout?<<?node->data?<<?"?";S.push(node);node?=?node->left;while?(!S.empty()?||?node){while?(node){cout?<<?node->data?<<?"?";?//?先輸出當前結點??S.push(node);node?=?node->left;?????????//?然后輸出左孩子}??????????????????????????????//?while?結束意味著左孩子已經全部輸出node?=?S.top()->right;?????????//?最后輸出右孩子S.pop();} }

    1.2 中序遍歷

    對于當前結點,先輸出它的左孩子,然后輸出該結點,最后輸出它的右孩子。以(1.1)圖為例:

  • 1-->2-->4,4 的左孩子為空,輸出 4,接著右孩子;

  • 6 的左孩子為空,輸出 6,接著右孩子;

  • 7 的左孩子為空,輸出 7,右孩子也為空,此時 2 的左子樹全部輸出,輸出 2,2 的右孩子為空,此時 1 的左子樹全部輸出,輸出 1,接著 1 的右孩子;

  • 3-->5,5 左孩子為空,輸出 5,右孩子也為空,此時 3 的左子樹全部輸出,而 3 的右孩子為空,至此 1 的右子樹全部輸出,結束。

  • /*?中序遍歷遞歸版?*/ void?InOrderRec(Node?*?node) {if?(node?==?nullptr)return;InOrderRec(node->left);?????//?先輸出左孩子cout?<<?node->data?<<?"?";??//?然后輸出當前結點InOrderRec(node->right);????//?最后輸出右孩子 }/*?前序遍歷非遞歸版?*/ void?InOrderNonRec(Node?*?node) {if?(node?==?nullptr)return;stack<Node*>?S;S.push(node);node?=?node->left;while?(!S.empty()?||?node){while?(node){S.push(node);node?=?node->left;}?????????????????????????????//?while?結束意味著左孩子為空cout?<<?S.top()->data?<<?"?";?//?左孩子已經全部輸出,接著輸出當前結點node?=?S.top()->right;????????//?左孩子全部輸出,當前結點也輸出后,最后輸出右孩子S.pop();} }

    1.3 后序遍歷

    對于當前結點,先輸出它的左孩子,然后輸出它的右孩子,最后輸出該結點。依舊以(1.1)圖為例:

  • 1->2->4->6->7,7 無左孩子,也無右孩子,輸出 7,此時 6 無左孩子,而 6 的右子樹也全部輸出,輸出 6,此時 4 無左子樹,而 4 的右子樹已全部輸出,接著輸出 4,此時 2 的左子樹全部輸出,且 2 無右子樹,輸出 2,此時 1 的左子樹全部輸出,接著轉向右子樹;

  • 3->5,5 無左孩子,也無右孩子,輸出 5,此時 3 的左子樹全部輸出,且 3 無右孩子,輸出 3,此時 1 的右子樹全部輸出,輸出 1,結束。

  • 非遞歸版本中,對于一個結點,如果我們要輸出它,只有它既沒有左孩子也沒有右孩子或者它有孩子但是它的孩子已經被輸出(由此設置 pre 變量)。若非上述兩種情況,則將該結點的右孩子和左孩子依次入棧,這樣就保證了每次取棧頂元素的時候,先依次遍歷左子樹和右子樹。

    /*?后序遍歷遞歸版?*/ void?PostOrderRec(Node?*?node) {if?(node?==?nullptr)return;PostOrderRec(node->left);???//?先輸出左孩子PostOrderRec(node->right);??//?然后輸出右孩子cout?<<?node->data?<<?"?";??//?最后輸出當前結點 }/*?后序遍歷非遞歸版?*/ void?PostOrderNonRec(Node?*?node) {if?(node?==?nullptr)return;Node?*?pre?=?nullptr;stack<Node*>?S;S.push(node);while?(!S.empty()){node?=?S.top();if?((!node->left?&&?!node->right)?||????????????????????//?第一個輸出的必是無左右孩子的葉子結點,只要第一個結點輸出,(pre &&?(pre == node->left || pre == node->right)))?//?以后的 pre 就不會是空。此處的判斷語句加入一個 pre,只是用來{???????????????????????????????????????????????????????//?確保可以正確輸出第一個結點。cout?<<?node->data?<<?"?";??//?左右孩子都全部輸出,再輸出當前結點pre?=?node;S.pop();}else{if?(node->right)S.push(node->right);??//?先進右孩子,再進左孩子,取出來的才是左孩子if?(node->left)S.push(node->left);}} }

    2 層次遍歷

    void?LevelOrder(Node?*?node) {Node?*?p?=?node;queue<Node*>?Q;??//?隊列Q.push(p);while?(!Q.empty()){p?=?Q.front();cout?<<?p->data?<<?"?";Q.pop();if?(p->left)Q.push(p->left);??//?注意順序,先進左孩子if?(p->right)Q.push(p->right);} }

    3 求樹的結點數

    int?CountNodes(Node?*?node) {if?(node?==?nullptr)return?0;return?CountNodes(node->left)?+?CountNodes(node->right)?+?1; }

    4 求樹的葉子數

    int?CountLeaves(Node?*?node) {if?(node?==?nullptr)return?0;if?(!node->left?&&?!node->right)return?1;return?CountLeaves(node->left)?+?CountLeaves(node->right); }

    5 求樹的深度

    int?GetDepth(Node?*?node) {if?(node?==?nullptr)return?0;int?left_depth?=?GetDepth(node->left)?+?1;int?right_depth?=?GetDepth(node->right)?+?1;return?left_depth?>?right_depth???left_depth?:?right_depth; }

    6 求二叉樹第k層的結點個數

    int?GetKLevel(Node?*?node,?int?k) {if?(node?==?nullptr)return?0;if?(k?==?1)return?1;return?GetKLevel(node->left,?k?-?1)?+?GetKLevel(node->right,?k?-?1); }

    7 判斷兩棵二叉樹是否結構相同

    不考慮數據內容。結構相同意味著對應的左子樹和對應的右子樹都結構相同。

    bool?StructureCmp(Node?*?node1,?Node?*?node2) {if?(node1?==?nullptr?&&?node2?==?nullptr)return?true;else?if?(node1?==?nullptr?||?node2?==?nullptr)return?false;return?StructureCmp(node1->left,?node2->left)?&&?Str1uctureCmp(node1->right,?node2->right); }

    8 求二叉樹的鏡像

    對于每個結點,我們交換它的左右孩子即可。

    void?Mirror(Node?*?node) {if?(node?==?nullptr)return;Node?*?temp?=?node->left;node->left?=?node->right;node->right?=?temp;Mirror(node->left);Mirror(node->right); }

    9 求兩個結點的最低公共祖先結點

    最低公共祖先,即 LCA(Lowest Common Ancestor),見下圖:結點 3 和結點 4 的最近公共祖先是結點 2,即 LCA(3,4)=2。在此,需要注意到當兩個結點在同一棵子樹上的情況,如結點 3 和結點 2 的最近公共祖先為 2,即 LCA(3,2)=2。同理 LCA(5,6)=4,LCA(6,10)=1。

    Node?*?FindLCA(Node?*?node,?Node?*?target1,?Node?*?target2) {if?(node?==?nullptr)return?nullptr;if?(node?==?target1?||?node?==?target2)return?node;Node?*?left?=?FindLCA(node->left,?target1,?target2);Node?*?right?=?FindLCA(node->right,?target1,?target2);if?(left?&&?right)??//?分別在左右子樹return?node;return?left???left?:?right;??//?都在左子樹或右子樹 }

    10 求任意兩結點距離

    首先找到兩個結點的 LCA,然后分別計算 LCA 與它們的距離,最后相加即可。

    int?FindLevel(Node?*?node,?Node?*?target) {if?(node?==?nullptr)return?-1;if?(node?==?target)return?0;int?level?=?FindLevel(node->left,?target);??//?先在左子樹找if?(level?==?-1)level?=?FindLevel(node->right,?target);??//?如果左子樹沒找到,在右子樹找if?(level?!=?-1)??//?找到了,回溯return?level?+?1;return?-1;??//?如果左右子樹都沒找到 }int?DistanceNodes(Node?*?node,?Node?*?target1,?Node?*?target2) {Node?*?lca?=?FindLCA(node,?target1,?target2);??//?找到最低公共祖先結點int?level1?=?FindLevel(lca,?target1);?int?level2?=?FindLevel(lca,?target2);return?level1?+?level2; }

    11 找出二叉樹中某個結點的所有祖先結點

    如果給定結點 5,則其所有祖先結點為 4,2,1。

    bool?FindAllAncestors(Node?*?node,?Node?*?target) {if?(node?==?nullptr)return?false;if?(node?==?target)return?true;if?(FindAllAncestors(node->left,?target)?||?FindAllAncestors(node->right,?target))??//?找到了{cout?<<?node->data?<<?"?";return?true;??//?回溯}return?false;??//?如果左右子樹都沒找到 }

    12 不使用遞歸和棧遍歷二叉樹

    1968 年,高德納(Donald Knuth)提出一個問題:是否存在一個算法,它不使用棧也不破壞二叉樹結構,但是可以完成對二叉樹的遍歷?隨后 1979 年,James H. Morris 提出了二叉樹線索化,解決了這個問題。(根據這個概念我們又提出了一個新的數據結構,即線索二叉樹,因線索二叉樹不是本文要介紹的內容,所以有興趣的朋友請移步線索二叉樹)

    前序,中序,后序遍歷,不管是遞歸版本還是非遞歸版本,都用到了一個數據結構--棧,為何要用棧?那是因為其它的方式沒法記錄當前結點的 parent,而如果在每個結點的結構里面加個 parent 分量顯然是不現實的,而線索化正好解決了這個問題,其含義就是利用結點的右孩子空指針,指向該結點在中序序列中的后繼。下面具體來看看如何使用線索化來完成對二叉樹的遍歷。先看前序遍歷,步驟如下:

  • 如果當前結點的左孩子為空,則輸出當前結點并將其右孩子作為當前結點;

  • 如果當前結點的左孩子不為空,在當前結點的左子樹中找到當前結點在中序遍歷下的前驅結點;

    • 2.1如果前驅結點的右孩子為空,將它的右孩子設置為當前結點,輸出當前結點并把當前結點更新為當前結點的左孩子;

    • 2.2如果前驅結點的右孩子為當前結點,將它的右孩子重新設為空,當前結點更新為當前結點的右孩子;

  • 重復以上步驟 1 和 2,直到當前結點為空。

  • /*?前序遍歷?*/ void?PreOrderMorris(Node?*?root) {Node?*?cur?=?root;Node?*?pre?=?nullptr;while?(cur){if?(cur->left?==?nullptr)??//?步驟?1{cout?<<?cur->data?<<?"?";cur?=?cur->right;}else{pre?=?cur->left;while?(pre->right?&&?pre->right?!=?cur)??//?步驟?2,找到?cur?的前驅結點pre?=?pre->right;if?(pre->right?==?nullptr)??//?步驟?2.1,cur?未被訪問,將?cur?結點作為其前驅結點的右孩子{cout?<<?cur->data?<<?"?";pre->right?=?cur;cur?=?cur->left;}else??//?步驟?2.2,cur?已被訪問,恢復樹的原有結構,更改?right?指針?{pre->right?=?nullptr;cur?=?cur->right;}}} }

    再來看中序遍歷,和前序遍歷相比只改動一句代碼,步驟如下:

  • 如果當前結點的左孩子為空,則輸出當前結點并將其右孩子作為當前結點;

  • 如果當前結點的左孩子不為空,在當前結點的左子樹中找到當前結點在中序遍歷下的前驅結點;

    • 2.1. 如果前驅結點的右孩子為空,將它的右孩子設置為當前結點,當前結點更新為當前結點的左孩子;

    • 2.2. 如果前驅結點的右孩子為當前結點,將它的右孩子重新設為空,輸出當前結點,當前結點更新為當前結點的右孩子;

  • 重復以上步驟 1 和 2,直到當前結點為空。

  • /*?中序遍歷?*/ void?InOrderMorris(Node?*?root) {Node?*?cur?=?root;Node?*?pre?=?nullptr;while?(cur){if?(cur->left?==?nullptr)??//(1){cout?<<?cur->data?<<?"?";cur?=?cur->right;}else{pre?=?cur->left;while?(pre->right?&&?pre->right?!=?cur)??//(2),找到?cur?的前驅結點pre?=?pre->right;if?(pre->right?==?nullptr)??//(2.1),cur?未被訪問,將?cur?結點作為其前驅結點的右孩子{pre->right?=?cur;cur?=?cur->left;}else??//(2.2),cur?已被訪問,恢復樹的原有結構,更改?right?指針?{cout?<<?cur->data?<<?"?";pre->right?=?nullptr;cur?=?cur->right;}}} }

    最后看下后序遍歷,后序遍歷有點復雜,需要建立一個虛假根結點 dummy,令其左孩子是 root。并且還需要一個子過程,就是倒序輸出某兩個結點之間路徑上的各個結點。步驟如下:

  • 如果當前結點的左孩子為空,則將其右孩子作為當前結點;

  • 如果當前結點的左孩子不為空,在當前結點的左子樹中找到當前結點在中序遍歷下的前驅結點;

    • 2.1. 如果前驅結點的右孩子為空,將它的右孩子設置為當前結點,當前結點更新為當前結點的左孩子;

    • 2.2. 如果前驅結點的右孩子為當前結點,將它的右孩子重新設為空,倒序輸出從當前結點的左孩子到該前驅結點這條路徑上的所有結點,當前結點更新為當前結點的右孩子;

  • 重復以上步驟 1 和 2,直到當前結點為空。

  • struct?Node {int?data;Node?*?left;Node?*?right;Node(int??data_,?Node?*?left_,?Node?*?right_){data?=?data_;left?=?left_;right?=?right_;} };void?ReversePrint(Node?*?from,?Node?*?to) {if?(from?==?to){cout?<<?from->data?<<?"?";return;}ReversePrint(from->right,?to);cout?<<?from->data?<<?"?"; }void??PostOrderMorris(Node?*?root) {Node?*?dummy?=?new?Node(-1,?root,?nullptr);??//?一個虛假根結點Node?*?cur?=?dummy;Node?*?pre?=?nullptr;while?(cur){if?(cur->left?==?nullptr)??//?步驟?1cur?=?cur->right;else{pre?=?cur->left;while?(pre->right?&&?pre->right?!=?cur)??//?步驟?2,找到?cur?的前驅結點pre?=?pre->right;if?(pre->right?==?nullptr)??//?步驟?2.1,cur?未被訪問,將?cur?結點作為其前驅結點的右孩子{pre->right?=?cur;cur?=?cur->left;}else??//?步驟?2.2,cur?已被訪問,恢復樹的原有結構,更改?right?指針{pre->right?=?nullptr;ReversePrint(cur->left,?pre);cur?=?cur->right;}}} }

    dummy 用的非常巧妙,建議讀者配合上面的圖模擬下算法流程。

    13 二叉樹前序中序推后序

    方式序列
    前序[1 2 4 7 3 5 8 9 6]
    中序[4 7 2 1 8 5 9 3 6]
    后序[7 4 2 8 9 5 6 3 1]

    以上面圖表為例,步驟如下:

  • 根據前序可知根結點為1;

  • 根據中序可知 4 7 2 為根結點 1 的左子樹和 8 5 9 3 6 為根結點 1 的右子樹;

  • 遞歸實現,把 4 7 2 當做新的一棵樹和 8 5 9 3 6 也當做新的一棵樹;

  • 在遞歸的過程中輸出后序。

  • /*?前序遍歷和中序遍歷結果以長度為?n?的數組存儲,pos1?為前序數組下標,pos2?為后序下標?*/int?pre_order_arry[n]; int?in_order_arry[n];void?PrintPostOrder(int?pos1,?int?pos2,?int?n) {if?(n?==?1){cout?<<?pre_order_arry[pos1];return;}if?(n?==?0)return;int?i?=?0;for?(;?pre_order_arry[pos1]?!=?in_order_arry[pos2?+?i];?i++);PrintPostOrder(pos1?+?1,?pos2,?i);PrintPostOrder(pos1?+?i?+?1,?pos2?+?i?+?1,?n?-?i?-?1);cout?<<?pre_order_arry[pos1]; }

    當然我們也可以根據前序和中序構造出二叉樹,進而求出后序。

    /*?該函數返回二叉樹的根結點?*/ Node?*?Create(int?pos1,?int?pos2,?int?n) {Node?*?p?=?nullptr;for?(int?i?=?0;?i?<?n;?i++){if?(pre_order_arry[pos1]?==?in_order_arry[pos2?+?i]){p?=?new?Node(pre_order_arry[pos1]);p->left?=?Create(pos1?+?1,?pos2,?i);p->right?=?Create(pos1?+?i?+?1,?pos2?+?i?+?1,?n?-?i?-?1);return?p;}}return?p; }

    14 判斷二叉樹是不是完全二叉樹

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

    首先若一個結點只有右孩子,肯定不是完全二叉樹;其次若只有左孩子或沒有孩子,那么接下來的所有結點肯定都沒有孩子,否則就不是完全二叉樹,因此設置 flag 標記變量。

    bool?IsCBT(Node?*?node) {bool?flag?=?false;queue<Node*>?Q;Q.push(node);while?(!Q.empty()){Node?*?p?=?Q.front();Q.pop();if?(flag){if?(p->left?||?p->right)return?false;}else{if?(p->left?&&?p->right){Q.push(p->left);Q.push(p->right);}else?if?(p->right)??//?只有右結點return?false;else?if?(p->left)???//?只有左結點{Q.push(p->left);flag?=?true;}else??//?沒有結點flag?=?true;}}return?true; }

    15 判斷是否是二叉查找樹的后序遍歷結果

    在后續遍歷得到的序列中,最后一個元素為樹的根結點。從頭開始掃描這個序列,比根結點小的元素都應該位于序列的左半部分;從第一個大于跟結點開始到跟結點前面的一個元素為止,所有元素都應該大于跟結點,因為這部分元素對應的是樹的右子樹。根據這樣的劃分,把序列劃分為左右兩部分,我們遞歸地確認序列的左、右兩部分是不是都是二元查找樹。

    int?array[n];??//?長度為?n?的序列,注意?begin?和?end?遵循的是左閉右閉原則bool?IsSequenceOfBST(int?begin,?int?end) {if?(end?-?begin?<=?0)return?true;int?root_data?=?array[end];??//?數組尾元素為根結點int?i?=?begin;for?(;?array[i]?<?root_data;?i++)?//?取得左子樹;int?j?=?i;for?(;?j?<?end;?j++)if?(array[j]?< root_data)??//?此時右子樹應該都大于根結點;若存在小于,直接?return?falsereturn?false;return?IsSequenceOfBST(begin,?i?-?1)?&&?IsSequenceOfBST(i,?end?-?1);??//?左右子樹是否都滿足 }

    16 給定一個二叉查找樹中的結點(存在一個指向父親結點的指針),找出在中序遍歷下它的后繼和前驅

    一棵二叉查找樹的中序遍歷序列,正好是升序序列。假如根結點的父結點為 nullptr,則:

  • 如果當前結點有右孩子,則后繼結點為這個右孩子的最左孩子;

  • 如果當前結點沒有右孩子;

    • 2.1. 當前結點為根結點,返回 nullptr;

    • 2.2. 當前結點只是個普通結點,也就是存在父結點;

    • 2.2.1. 當前結點是父親結點的左孩子,則父親結點就是后繼結點;

    • 2.2.2. 當前結點是父親結點的右孩子,沿著父親結點往上走,直到 n-1 代祖先是 n 代祖先的左孩子,則后繼為 n 代祖先或遍歷到根結點也沒找到符合的,則當前結點就是中序遍歷的最后一個結點,返回 nullptr。

    /*?求后繼結點?*/ Node?*?Increment(Node?*?node) {if?(node->right)??//?步驟?1{node?=?node->right;while?(node->left)node?=?node->left;return?node;}else??//?步驟?2{if?(node->parent?==?nullptr)??//?步驟?2.1return?nullptr;Node?*?p?=?node->parent;??//?步驟?2.2if?(p->left?==?node)??//?步驟?2.2.1return?p;else??//?步驟?2.2.2{while?(p->right?==?node){node?=?p;p?=?p->parent;if?(p?==?nullptr)return?nullptr;}return?p;}} }

    仔細觀察上述代碼,總覺得有點啰嗦。比如,過多的 return,步驟 2 的層次太多。綜合考慮所有情況,改進代碼如下:

    Node?*?Increment(Node?*?node) {if?(node->right){node?=?node->right;while?(node->left)node?=?node->left;}else{Node?*?p?=?node->parent;while?(p?&&?p->right?==?node){node?=?p;p?=?p->parent;}node?=?p;}return?node; }

    上述的代碼是基于結點有 parent 指針的,若題意要求沒有 parent 呢?網上也有人給出了答案,個人覺得沒有什么價值,有興趣的朋友可以到這里查看。

    而求前驅結點的話,只需把上述代碼的 left 與 right 互調即可,很簡單。

    17 二分查找樹轉化為排序的循環雙鏈表

    二分查找樹的中序遍歷即為升序排列,問題就在于如何在遍歷的時候更改指針的指向。一種簡單的方法時,遍歷二分查找樹,將遍歷的結果放在一個數組中,之后再把該數組轉化為雙鏈表。如果題目要求只能使用 O(1)O(1) 內存,則只能在遍歷的同時構建雙鏈表,即進行指針的替換。

    我們需要用遞歸的方法來解決,假定每個遞歸調用都會返回構建好的雙鏈表,可把問題分解為左右兩個子樹。由于左右子樹都已經是有序的,當前結點作為中間的一個結點,把左右子樹得到的鏈表連接起來即可。

    /*?合并兩個?a,?b?兩個循環雙向鏈表?*/ Node?*?Append(Node?*?a,?Node?*?b) {if?(a?==?nullptr)?return?b;if?(b?==?nullptr)?return?a;//?分別得到兩個鏈表的最后一個元素Node?*?a_last?=?a->left;Node?*?b_last?=?b->left;//?將兩個鏈表頭尾相連??a_last->right?=?b;b->left?=?a_last;a->left?=?b_last;b_last->right?=?a;return?a; }/*?遞歸的解決二叉樹轉換為雙鏈表?*/ Node?*?TreeToList(Node?*?node) {if?(node?==?nullptr)?return?nullptr;//?遞歸解決子樹Node?*?left_list?=?TreeToList(node->left);Node?*?right_list?=?TreeToList(node->right);//?把根結點轉換為一個結點的雙鏈表,方便后面的鏈表合并??node->left?=?node;node->right?=?node;//?合并之后即為升序排列left_list?=?Append(left_list,?node);left_list?=?Append(left_list,?right_list);return?left_list; }

    18 有序鏈表轉化為平衡的二分查找樹(Binary Search Tree)

    我們可以采用自頂向下的方法。先找到中間結點作為根結點,然后遞歸左右兩部分。所以我們需要先找到中間結點,對于單鏈表來說,必須要遍歷一邊,可以使用快慢指針加快查找速度。

    struct?TreeNode {int?data;TreeNode?*?left;TreeNode?*?right;TreeNode(int?data_)?{?data?=?data_;?left?=?right?=?nullptr;?} };struct?ListNode {int?data;ListNode?*?next;ListNode(int?data_)?{?data?=?data_;?next?=?nullptr;?} };TreeNode?*?SortedListToBST(ListNode?*??list_node) {if?(!list_node)?return?nullptr;if?(!list_node->next)?return?(new?TreeNode(list_node->data));//?用快慢指針找到中間結點??ListNode?*?pre_slow?=?nullptr;??//?記錄慢指針的前一個結點ListNode?*?slow?=?list_node;????//?慢指針ListNode?*?fast?=?list_node;????//?快指針while?(fast?&&?fast->next){pre_slow?=?slow;slow?=?slow->next;fast?=?fast->next->next;}TreeNode?*?mid?=?new?TreeNode(slow->data);//?分別遞歸左右兩部分if?(pre_slow){pre_slow->next?=?nullptr;mid->left?=?SortedListToBST(list_node);}mid->right?=?SortedListToBST(slow->next);return?mid; }

    由 f(n)=2f(\frac n2)+\frac n2f(n)=2f(2n)+2n 得,所以上述算法的時間復雜度為 O(nlogn)O(nlogn)。

    不妨換個思路,采用自底向上的方法:

    TreeNode?*?SortedListToBSTRec(ListNode?*&?list,?int?start,?int?end) {if?(start?>?end)?return?nullptr;int?mid?=?start?+?(end?-?start)?/?2;TreeNode?*?left_child?=?SortedListToBSTRec(list,?start,?mid?-?1);??//?注意此處傳入的是引用TreeNode?*?parent?=?new?TreeNode(list->data);parent->left?=?left_child;list?=?list->next;parent->right?=?SortedListToBSTRec(list,?mid?+?1,?end);return?parent; }TreeNode?*?SortedListToBST(ListNode?*?node) {int?n?=?0;ListNode?*?p?=?node;while?(p){n++;p?=?p->next;}return?SortedListToBSTRec(node,?0,?n?-?1); }

    如此,時間復雜度降為 O(n)O(n)。

    19 判斷是否是二叉查找樹

    我們假定二叉樹沒有重復元素,即對于每個結點,其左右孩子都是嚴格的小于和大于。

    下面給出兩個方法:

    方法 1:

    bool?IsBST(Node?*?node,?int?min,?int?max) {if?(node?==?nullptr)return?true;if?(node->data?<=?min?||?node->data?>=?max)return?false;return?IsBST(node->left,?min,?node->data)?&&?IsBST(node->right,?node->data,?max); }IsBST(node,?INT_MIN,?INT_MAX);

    方法 2:

    利用二叉查找樹中序遍歷時元素遞增來判斷。

    bool?IsBST(Node?*?node) {static?int?pre?=?INT_MIN;if?(node?==?nullptr)return?true;if?(!IsBST(node->left))return?false;if?(node->data?<?pre)return?false;pre?=?node->data;return?IsBST(node->right); }

    來源 https://segmentfault.com/a/1190000008850005

    鏈接:Ethson


    您還可以在以下平臺找到我們

    你點的每個在看,我都認真當成了喜歡

    總結

    以上是生活随笔為你收集整理的深入浅出!二叉树详解,包含C语言代码的全部內容,希望文章能夠幫你解決所遇到的問題。

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

    亚洲精品理论片 | 香蕉久久久久 | 亚洲干| 中文字幕观看视频 | av福利超碰网站 | 久久久久久久毛片 | 国产aa精品| 亚洲va欧美va | 国产在线不卡一区 | 日韩大片免费观看 | 色姑娘综合网 | 天天操夜夜操天天射 | 最新国产精品亚洲 | 九九久 | 国产精品黄网站在线观看 | 久久久久久国产精品久久 | 亚洲精品成人免费 | 美女视频黄网站 | 美女网站视频免费黄 | 欧美日韩国产伦理 | 成 人 黄 色视频免费播放 | 成人免费视频a | 亚洲精品欧美成人 | 国产精品久久二区 | 免费中文字幕视频 | 免费在线黄网 | 成人91在线| 丁香九月激情综合 | 日韩精品综合在线 | 蜜臀av性久久久久av蜜臀妖精 | 免费h视频 | 成年人在线免费看片 | 日韩欧美在线综合网 | 又湿又紧又大又爽a视频国产 | 国产美女黄网站免费 | 国产成人三级在线播放 | 久久久这里有精品 | 中文字幕乱在线伦视频中文字幕乱码在线 | 色网址99| 在线小视频 | 天天色天天 | 免费v片 | 五月天综合色激情 | 97超碰人人看 | 日韩久久精品一区二区三区 | 国产精品美女免费视频 | 五月婷激情 | 久久精视频 | 黄色免费大全 | 久久毛片高清国产 | 一级黄色在线视频 | 久久99国产精品自在自在app | 女人18毛片a级毛片一区二区 | 亚洲最大av | 国产成人精品久久 | 日韩资源在线 | 91黄在线看| 丰满少妇一级片 | 激情久久一区二区三区 | 91精品一区二区三区蜜桃 | av网站有哪些 | av三级av| 亚洲精品在线观看不卡 | 久草在线一免费新视频 | 亚洲自拍偷拍色图 | 丁香激情综合久久伊人久久 | 免费观看国产成人 | 久久免费播放视频 | 国产亚洲精品av | 日韩免| 午夜久久久久久久久久影院 | 美女视频黄色免费 | 久久免费精品一区二区三区 | 五月婷婷亚洲 | 国产精品伦一区二区三区视频 | 亚洲高清激情 | 亚洲精品影院在线观看 | 亚洲一区二区精品在线 | 亚洲国产精品999 | www.777奇米 | 亚洲片在线资源 | 精品久久久亚洲 | 激情av资源网 | 国产午夜精品理论片在线 | www五月天| 综合国产视频 | 99久久婷婷国产 | 亚洲黄色a| 国产精品免费观看久久 | 91精品国产麻豆国产自产影视 | 午夜影视av| 青青久视频 | 99久久精品无免国产免费 | av在线网站免费观看 | 久久国产精品一区二区 | 国产粉嫩在线观看 | 一级黄色在线免费观看 | 插插插色综合 | 伊人狠狠色 | 免费在线观看成年人视频 | 日本福利视频在线 | 久久五月情影视 | 美女网站在线播放 | 欧美天堂影院 | 超碰成人网| 国内三级在线 | 久久深爱网 | 免费久久网 | 国产黄免费 | 免费精品视频 | 麻豆影视在线观看 | 综合黄色网 | 日韩免| 人人澡人人模 | 欧美污污视频 | 国产亚洲视频在线观看 | 成人羞羞免费 | 欧美黄色免费 | 色999五月色| 最近中文字幕在线中文高清版 | 国产精品嫩草影院99网站 | 国产一级久久久 | 嫩草伊人久久精品少妇av | 日韩亚洲欧美中文字幕 | 久久精品国产亚洲 | 色婷婷99 | 99在线精品视频在线观看 | 在线观看国产高清视频 | 麻豆影视在线播放 | 草久中文字幕 | 欧美a免费 | 精品国产一区二区三区蜜臀 | 99久e精品热线免费 99国产精品久久久久久久久久 | 综合中文字幕 | 午夜精品视频免费在线观看 | 亚洲国产无 | 久久草草热国产精品直播 | 毛片激情永久免费 | 精品免费观看视频 | 国产精品电影在线 | 国产99久久久精品 | 久久激情电影 | 天天操天天操天天操天天操 | 在线观看国产麻豆 | 日韩精品免费在线观看 | 99久久久国产免费 | 热久久最新地址 | 欧美一二三区在线观看 | 日韩av不卡在线 | 国产流白浆高潮在线观看 | www.xxx.性狂虐 | 丁香婷婷激情 | 伊人久久五月天 | 欧美精品国产精品 | 成人在线黄色电影 | 99在线视频观看 | 国产私拍在线 | 在线观看成人网 | 91精品久久久久久综合乱菊 | 91完整版在线观看 | 亚洲黄色av | 一区二区视频在线看 | 欧美激情综合网 | 日韩av伦理片 | 一区二区三区日韩在线观看 | 久久视了| 久久人人插 | www亚洲精品| 亚洲免费一级电影 | 久久精品导航 | 一区二区亚洲精品 | 国产精品成人自产拍在线观看 | 狠狠躁夜夜躁人人爽超碰91 | 黄色动态图xx | 亚洲精品在线视频 | 少妇精品久久久一区二区免费 | 成人av中文字幕在线观看 | 91在线播放视频 | 欧美日韩在线免费观看 | 69国产盗摄一区二区三区五区 | 婷婷激情久久 | 欧美成年人在线观看 | 一区二区三区在线免费观看 | 欧美激情精品一区 | 激情伊人五月天久久综合 | 日韩免费观看一区二区 | 黄色网www| 亚洲黄色免费在线看 | 中文字幕日本特黄aa毛片 | 亚洲精品网站在线 | 婷婷夜夜| 伊人婷婷激情 | 日韩毛片在线一区二区毛片 | 久久精品国产免费看久久精品 | 中文字幕一区二区三区在线视频 | 极品久久久久 | 欧美精品国产综合久久 | 欧美日韩国产免费视频 | 美女又爽又黄 | 国产91在| 亚洲精品乱码久久久久久蜜桃不爽 | 中文字幕在线观看视频网站 | 亚洲视频久久久久 | 91精品视频播放 | 亚洲午夜精品久久久 | 美女视频黄频大全免费 | 久久久久亚洲精品 | 丁香六月色 | 91毛片在线| 青春草免费在线视频 | 亚洲专区在线播放 | 五月婷婷在线综合 | 日本在线中文 | 精品久久久久一区二区国产 | 丁香激情综合久久伊人久久 | 亚洲精品欧美成人 | 中文字幕中文中文字幕 | 在线日韩中文字幕 | 国内久久精品 | 美州a亚洲一视本频v色道 | 免费视频网 | 青青草国产精品 | 国产黄色片网站 | 久久99精品一区二区三区三区 | 国产精品免费人成网站 | 一区二区三区在线看 | 欧美一区日韩一区 | 在线视频日韩欧美 | 久久久精品久久日韩一区综合 | 伊人精品在线 | 日韩高清一区 | avove黑丝| 国产黄在线| 午夜视频一区二区三区 | 欧美韩国在线 | 99久久婷婷 | 337p日本大胆噜噜噜噜 | 亚洲精品videossex少妇 | 五月天天天操 | 国产精品视频app | 99这里只有精品99 | 91九色视频在线观看 | 久久精品91久久久久久再现 | 成人午夜精品 | 毛片无卡免费无播放器 | 日日爽视频 | 91黄视频在线 | 国产精品永久在线 | 婷婷在线综合 | 亚洲爱爱视频 | 色香com.| 久草视频免费在线播放 | 超碰97.com | 国产区精品区 | 亚洲精品乱码 | 免费在线激情电影 | 五月天九九 | 免费在线观看国产黄 | 久久观看| 成年人免费看片 | 欧美伦理一区二区 | 伊人色**天天综合婷婷 | 国产欧美日韩精品一区二区免费 | 五月婷网站 | 国产精品久久网 | 超碰国产在线播放 | www在线免费观看 | 久久久在线免费观看 | 精品视频区 | 成人av影院在线观看 | 国产精品影音先锋 | 91丨九色丨蝌蚪丰满 | 免费在线观看毛片网站 | 永久中文字幕 | 97色在线观看免费视频 | 天天天干| 麻豆视频在线观看免费 | 日韩精品一区二区免费 | 欧美性生活免费看 | 欧美日韩一级久久久久久免费看 | 草久在线观看视频 | 欧美激情综合五月色丁香小说 | 午夜av片 | 久久久精品免费看 | 夜色.com| 欧美精品三级在线观看 | 国精产品永久999 | 免费在线观看91 | 九九精品毛片 | 成年人免费观看国产 | 国产区免费在线 | 黄色a在线观看 | 色丁香综合 | 天天综合网~永久入口 | 91麻豆精品国产91久久久更新时间 | 在线黄色国产电影 | 国产成人91 | 日本精品视频在线播放 | 就要干b | 中文在线免费观看 | 久久美女视频 | 97品白浆高清久久久久久 | 免费高清在线观看电视网站 | 午夜精品久久久久久久久久久久 | 在线观看爱爱视频 | 色五月情 | 国产一区二区在线观看免费 | 在线影院中文字幕 | 国产精品 999 | 国产精品ssss在线亚洲 | 日韩av资源在线观看 | 亚洲精品久久久久久中文传媒 | 久久桃花网 | 色中色亚洲 | 最新av网址在线观看 | 97香蕉超级碰碰久久免费软件 | 国产区精品在线观看 | 精品福利在线 | 亚洲黄色在线观看 | 天天做天天爱天天综合网 | 中文字幕成人在线观看 | 99精品久久99久久久久 | 精品视频资源站 | 久久96国产精品久久99漫画 | 久久激情五月丁香伊人 | 久久综合色婷婷 | 亚洲精品黄网站 | 超碰在线最新网址 | 中文字幕亚洲精品在线观看 | 精品伦理一区二区三区 | 日韩中文三级 | 97成人资源 | 久久er99热精品一区二区三区 | 在线视频日韩精品 | 久久99精品久久久久久清纯直播 | 久艹在线播放 | 91九色porn在线资源 | 成人在线观看资源 | 992tv又爽又黄的免费视频 | 久草手机视频 | 久久99热这里只有精品 | 美女免费网视频 | 久草资源在线观看 | 亚洲区另类春色综合小说校园片 | 999国产在线 | 亚洲精品理论片 | 在线观看成人网 | 99亚洲国产 | 精品视频资源站 | 国产精品久久久久久久免费 | 四虎国产免费 | 欧美午夜久久久 | 黄色亚洲在线 | 91亚洲在线 | 国产一级电影在线 | 1000部国产精品成人观看 | 91亚洲精品在线观看 | 国产精品99久久久久人中文网介绍 | 久久久麻豆精品一区二区 | 最新国产视频 | av网站免费看 | 久久久久综合视频 | 人人爽人人搞 | 岛国一区在线 | 精品字幕在线 | 日韩欧美一区二区三区免费观看 | 2024av| 久久精品视频在线看 | 日韩精品一区二区三区免费观看视频 | 国产精品12| 综合网av| 日韩精品一区二区三区免费观看 | 久久久综合香蕉尹人综合网 | 中文字幕有码在线观看 | 天天伊人狠狠 | 麻花天美星空视频 | 国产在线欧美日韩 | 天天干国产 | 国产一区二区中文字幕 | 久久久久久久久久久国产精品 | 日韩手机视频 | 久久久www成人免费精品 | 婷婷www | 激情影音先锋 | 国产一二三精品 | 国产麻豆果冻传媒在线观看 | 天天操天天操天天操天天 | 精品久久久久久久久久久久久久久久久久 | 日本三级香港三级人妇99 | 黄色精品一区 | 香蕉网址 | 欧美日韩国产mv | av在线网站大全 | 日本中文字幕在线播放 | 天天操欧美 | 韩日精品在线观看 | 亚洲国产精品视频在线观看 | 久久精视频 | 亚洲精品视频免费观看 | 色夜影院 | 色94色欧美 | 国产精品久久久久久久久久久杏吧 | 麻豆视频免费网站 | 欧洲精品亚洲精品 | 韩国一区二区三区视频 | 欧美另类人妖 | 中文字幕一区二区三区在线播放 | 国产精品99久久99久久久二8 | 91成人蝌蚪 | 香蕉视频在线免费 | 久热免费| 精品在线99| 欧美精品三级 | 久久免费99精品久久久久久 | 国产欧美精品一区二区三区 | 爱情影院aqdy鲁丝片二区 | 久久久久久久影院 | 国产又粗又猛又色又黄视频 | 黄网站色视频免费观看 | 少妇激情久久 | 91九色视频在线观看 | 免费在线观看av电影 | 中文字幕在线色 | av黄在线播放 | 欧美极品在线播放 | 91在线中文| 亚洲精品国产综合99久久夜夜嗨 | 久久福利小视频 | 91污污视频在线观看 | 不卡的av在线 | 欧美a级成人淫片免费看 | 99riav1国产精品视频 | 免费精品国产va自在自线 | 久久久久久久久久国产精品 | 国产日韩欧美视频 | 精品国产乱码久久久久久1区二区 | 成人黄色大片 | 国产精品9999久久久久仙踪林 | 五月天最新网址 | 在线视频a| 国产九色在线播放九色 | 国产精品嫩草在线 | 一区二区激情 | 精品国产美女在线 | 91精品福利在线 | 九九精品在线观看 | 国产精品一区二区免费视频 | 2019中文字幕网站 | 国产精品久久久久高潮 | 91传媒视频在线观看 | 又爽又黄又无遮挡网站动态图 | 亚洲精品久久久久久中文传媒 | 婷婷六月天丁香 | 精品一区二区视频 | 婷婷色狠狠 | 中文字幕 国产精品 | 日韩中文幕 | 一级淫片在线观看 | 美女视频国产 | 91在线porny国产在线看 | 日本少妇久久久 | 白丝av在线| 成人v| 操操日日 | 天天躁天天狠天天透 | 免费亚洲视频在线观看 | 国产成人av福利 | 一区二区视频在线观看免费 | 国产精品毛片一区视频 | 久久伦理网| 色综合天天狠狠 | 在线看国产视频 | 91中文字幕网 | 天天色天天射天天综合网 | 在线观看免费中文字幕 | 射综合网 | 久久久美女 | 欧美久久电影 | 欧美精彩视频在线观看 | 97爱| 欧美日韩免费视频 | 国产精品av免费 | 99久久99久久精品国产片果冰 | 国产成人免费观看久久久 | 亚洲爱爱视频 | 久久久久久久久久影视 | 国产一区在线观看免费 | 国产欧美在线一区二区三区 | 天天在线免费视频 | 久久理论影院 | 国产乱码精品一区二区蜜臀 | a视频免费看 | 久久国产片 | 日韩乱色精品一区二区 | 人人爽久久涩噜噜噜网站 | 天天爱天天操天天爽 | 国产又粗又猛又黄 | av免费在线免费观看 | 一本一道久久a久久综合蜜桃 | 五月婷婷国产 | 91亚洲精品久久久 | 国产精品视频地址 | 天天操夜夜叫 | 国产专区精品视频 | 亚洲欧美日本一区二区三区 | 国产一区在线免费观看视频 | 国产美女免费视频 | 婷婷免费在线视频 | 天天综合网天天 | 超碰在线cao| 97人人添人澡人人爽超碰动图 | 国产在线永久 | 久久久国产精品网站 | 成 人 黄 色 视频免费播放 | 色天天天| 97国产大学生情侣酒店的特点 | 99亚洲国产| 偷拍久久久 | 粉嫩av一区二区三区免费 | 日韩欧美网站 | 欧美日韩视频一区二区三区 | 97高清视频 | 992tv人人草| 天堂成人在线 | 国产原创在线观看 | 看污网站 | 久久人操| 啪啪午夜免费 | 国产无套视频 | 婷婷亚洲最大 | 最新影院| 成人av影视在线 | 精品国产伦一区二区三区 | 五月花丁香婷婷 | 夜夜干天天操 | 久草免费在线观看视频 | 东方av免费在线观看 | 69国产成人综合久久精品欧美 | 亚洲人视频在线 | 久久久福利视频 | 黄色成人av | 色综合天天狠天天透天天伊人 | av在线8| 久久视频精品在线观看 | 婷婷在线色 | 欧洲精品视频一区二区 | 伊人国产视频 | 国产专区在线播放 | 99精品一区二区三区 | 精品亚洲一区二区三区 | 亚洲欧美在线视频免费 | 亚洲人成人99网站 | 色偷偷88欧美精品久久久 | 激情在线网址 | 亚洲一区日韩精品 | 麻豆超碰| 97电影在线| www.色午夜.com | 久在线 | 久久久久这里只有精品 | 天天色影院 | 一级一片免费视频 | 在线看黄色的网站 | 国产偷v国产偷∨精品视频 在线草 | 99人成在线观看视频 | 91av亚洲| 午夜精品成人一区二区三区 | 国产69精品久久久久久 | 免费一级毛毛片 | 日韩精品免费在线观看 | 在线免费视频 你懂得 | 国产主播大尺度精品福利免费 | 久久99国产精品久久 | 久久久综合九色合综国产精品 | 国产在线自 | 久久99国产精品视频 | 麻豆传媒一区二区 | www.五月天色| 亚洲成人资源网 | 夜夜躁日日躁狠狠躁 | 国产资源中文字幕 | 免费看片网址 | 最近免费观看的电影完整版 | 天天拍天天干 | 黄色三级av | 丁香婷婷深情五月亚洲 | 97香蕉久久超级碰碰高清版 | 激情五月开心 | av在线一二三区 | 日韩在线视频播放 | 久久成人国产精品 | 亚洲经典视频 | 亚洲精品午夜一区人人爽 | 欧亚日韩精品一区二区在线 | 亚洲在线| 中文字幕在线观看网站 | 日日碰狠狠躁久久躁综合网 | 国产精品9999久久久久仙踪林 | 日韩在线视频网站 | 成人久久影院 | av在线电影网站 | 国产人成一区二区三区影院 | 91精品国自产在线偷拍蜜桃 | 国内丰满少妇猛烈精品播放 | 精品久久久久久亚洲综合网 | 黄色avwww | 亚洲视频第一页 | 久久综合色一综合色88 | 成人免费中文字幕 | 在线观看第一页 | 亚洲一区二区视频在线 | 激情五月婷婷 | 久草观看 | 国产日韩欧美在线免费观看 | 久草网视频| 国产一级免费av | 国产国语在线 | 色中色亚洲 | 97色资源| 天天射天天射天天射 | 国产在线探花 | 免费久久视频 | 天天色天天综合网 | 丰满少妇久久久 | 中文字幕在线视频免费播放 | 欧美大片aaa| 狠狠操天天射 | 麻豆果冻剧传媒在线播放 | 久久免费视频在线观看6 | 日日干天天插 | 天天爱av导航 | 欧美成人黄色 | 国产中文字幕第一页 | 伊人春色电影网 | 91最新在线 | 亚洲高清网站 | 国产麻豆电影在线观看 | 国模视频一区二区三区 | 亚洲精品伦理在线 | 久久亚洲综合色 | 五月丁色| 久久久美女 | 婷婷激情在线 | www.com.黄| 婷婷伊人五月 | 91精品1区 | 狠狠色丁香婷婷综合欧美 | 99r在线视频 | 午夜影视剧场 | 久久免费片 | 成人黄色小视频 | 国产精品手机在线观看 | 国产视频久久久 | 视频在线99re | 免费在线观看a v | 国产一区福利在线 | www.亚洲精品视频 | 天天干天天干天天干天天干天天干天天干 | 国产成人一级电影 | 一区二区精品在线 | 香蕉久草 | www.天天射.com | 欧美日韩高清一区 | 亚洲精品视频二区 | 国产超碰在线观看 | 精品视频9999 | 狠狠色噜噜狠狠狠狠2021天天 | 欧美精品一区二区免费 | 国产在线不卡精品 | 免费91在线 | 午夜少妇 | 天堂av在线网站 | 国产日韩精品一区二区在线观看播放 | 久久综合五月 | 国产小视频你懂的 | 久久精品免费电影 | 天天操天天干天天爱 | 成人中文字幕在线观看 | 中文字幕一区二区三区四区视频 | 97日日| 人人爱人人射 | 天天色棕合合合合合合 | 激情综合网天天干 | 亚洲免费av在线 | 日韩视频精品在线 | 亚洲第一av在线 | 在线欧美最极品的av | 就要干b | 女女av在线| 久久久www成人免费精品张筱雨 | 国产成人精品亚洲日本在线观看 | av爱干 | 久久精品a | 欧美成人亚洲 | 99久久精品无免国产免费 | 国产精品系列在线播放 | 黄污网| 在线观看黄a | 99精品视频在线观看免费 | 三级小视频在线观看 | 亚洲精品乱码白浆高清久久久久久 | 欧美国产大片 | 国产专区一 | 精品国产一区二区三区日日嗨 | 国产一级在线播放 | 久久久久亚洲国产 | 黄色小说免费观看 | 一区三区视频在线观看 | 免费在线观看不卡av | 蜜臀91丨九色丨蝌蚪老版 | 97av在线视频免费播放 | 国产成人精品一区二区 | 亚洲精品国产自产拍在线观看 | 午夜精品视频一区二区三区在线看 | 国产99亚洲 | 狠狠干网址 | 日日夜夜国产 | 亚洲视频2 | 国产精品成人在线 | 日本精品一区二区三区在线播放视频 | 日韩视频www | 久久精彩免费视频 | 亚洲精品2区 | 欧美,日韩 | 在线视频一二区 | 黄色a在线观看 | 国产123av | 日日摸日日 | 日韩精品一区二区三区在线视频 | 国产精品久久久一区二区 | 99精品在线 | 欧美精品一区二区性色 | 久操视频在线观看 | 亚洲精选99| 色视频在线观看免费 | 婷婷性综合 | 久久艹国产视频 | 亚洲国产成人久久 | 在线免费av网站 | 激情视频久久 | 97在线视频免费播放 | 高清国产午夜精品久久久久久 | 成人国产电影在线观看 | 免费福利在线 | 99热国产在线观看 | 国产精品一区二区免费视频 | 91色综合| 日韩欧美视频一区二区三区 | 亚洲成色777777在线观看影院 | 超碰在线人人97 | 久久视频这里只有精品 | 午夜在线免费观看视频 | 91精品免费| 精品99视频 | 天天插综合 | 国产成人三级在线 | 成人国产精品一区二区 | 激情婷婷综合网 | 中文字幕日本在线 | 麻豆免费观看视频 | www视频免费在线观看 | 国产中文欧美日韩在线 | 中文国产字幕在线观看 | 国产一区在线精品 | 国产成人99av超碰超爽 | 久久久www成人免费精品 | 久久歪歪 | 国产黄色视 | 高清国产在线一区 | 国产中文字幕在线播放 | 日韩精品免费一区二区三区 | 国产99久久久精品 | 人人澡人人干 | 国产精品一区二区麻豆 | 人人看人人爱 | 日韩在线电影一区二区 | av在线a | 精品成人在线 | 麻豆免费精品视频 | 日韩在线免费看 | 免费精品视频在线观看 | 在线观看视频在线 | 黄色国产精品 | www视频在线免费观看 | 日本最新高清不卡中文字幕 | 91大神电影 | 99久精品 | 草久在线播放 | 四虎国产精品永久在线国在线 | 99在线热播精品免费 | 少妇高潮冒白浆 | 成年人黄色免费网站 | 国产精品自拍在线 | 在线日韩中文字幕 | 中文字幕第一页在线视频 | 一区二区视频播放 | 四虎成人精品永久免费av九九 | 91精品免费| 天天操天天是 | 在线观看中文字幕一区二区 | 男女啪啪视屏 | 999精品| 在线黄色毛片 | 久久伦理影院 | 日韩在线免费不卡 | 国产一区二区三区高清播放 | 黄网站色欧美视频 | 色综合天天狠天天透天天伊人 | 一区二区三区在线免费观看 | 成人精品视频久久久久 | 中文亚洲欧美日韩 | av综合网址| 九九有精品 | 欧美伦理一区 | 欧美精品少妇xxxxx喷水 | 97综合网| 9色在线视频 | 欧美性色综合网站 | 精品免费观看视频 | 久草视频在线免费 | 国产午夜不卡 | wwwwww黄| 91精品推荐 | 天天天干天天天操 | 国产又粗又猛又黄又爽 | 午夜精品久久久久久久久久 | av在线免费观看不卡 | 91av视频免费观看 | 成人免费观看视频网站 | 四虎在线影视 | 一区二区三区在线免费观看视频 | 我要色综合天天 | 天天干天天怕 | 91在线视频精品 | 久久亚洲美女 | 91在线产啪 | 夜夜看av| 91av官网| 五月婷婷丁香色 | 麻豆视频免费 | 天天爱天天色 | 中文字幕在线看片 | 国产精品一区二区三区久久久 | 成人黄色大片在线观看 | 外国av网 | 亚洲91精品在线观看 | 久久精品视频在线观看免费 | 天天干天天草天天爽 | 国产精品久久久99 | av一本久道久久波多野结衣 | 91在线看视频免费 | 在线视频观看你懂的 | 免费成人黄色 | 日韩av电影免费观看 | 99国产一区 | 欧美色图视频一区 | 麻豆久久| 日本不卡一区二区 | 中文字幕一区二区三区久久蜜桃 | 国产亚洲精品久久19p | 日韩免费一二三区 | 日本久久精品视频 | 麻豆传媒一区二区 | 九色视频网站 | 成年人免费在线观看 | 亚洲精品在线网站 | 国产永久免费高清在线观看视频 | 中文有码在线视频 | 日韩三级视频在线观看 | 热久久最新地址 | 免费视频在线观看网站 | 精品xxx | 五月天久久婷婷 | 国产精品久久久久久久久软件 | 国产亚洲精品免费 | 手机在线看a | 激情五月婷婷丁香 | 亚洲一区在线看 | 波多野结衣最新 | 欧美福利片在线观看 | 91丨九色丨国产丨porny精品 | 婷婷伊人综合亚洲综合网 | av在线免费观看黄 | 香蕉视频在线免费看 | 超碰99人人 | 久久精品牌麻豆国产大山 | 亚洲一区 av| 久久精品欧美一区 | a国产精品 | 一本一本久久a久久精品综合妖精 | 午夜影院在线观看18 | 久久噜噜少妇网站 | 欧美日韩18 | 成人av在线亚洲 | 综合网欧美 | 国产在线不卡 | 亚洲精选视频免费看 | 免费在线观看的av网站 | 黄色毛片视频免费 | 国产91丝袜在线播放动漫 | 中文字幕在线播放日韩 | 中文字幕在线观看一区二区 | 中文字幕在线观看网 | 激情偷乱人伦小说视频在线观看 | 中文视频一区二区 | 最新成人在线 | 日韩三级精品 | www免费视频com | 四虎影视成人精品 | 99久久爱 | 精品嫩模福利一区二区蜜臀 | 欧美一级裸体视频 | 99在线视频免费观看 | 国产精品久久久久久妇 | 日韩av播放在线 | 日本久久电影 | 亚洲精品在线观看不卡 | 搡bbbb搡bbb视频 | 久久国产精品99久久久久久老狼 | 韩日av在线 | 久久亚洲福利 | 国产综合香蕉五月婷在线 | 天天操天天拍 | 91精品老司机久久一区啪 | 国产.精品.日韩.另类.中文.在线.播放 | 国产96在线观看 | 一级片黄色片网站 | 午夜精品福利一区二区 | 日日爽视频 | 久久精品一区二区三区四区 | 超碰在线人人 | 在线www色| 亚洲精品777 | 久久久久综合精品福利啪啪 | 蜜臀aⅴ精品一区二区三区 久久视屏网 | 97热久久免费频精品99 | 国产精品一区二区免费在线观看 | 99r精品视频在线观看 | 综合网av | 男女激情麻豆 | 毛片网站免费 | 国产69精品久久久久久久久久 | 亚洲综合欧美精品电影 | 免费在线电影网址大全 | 九九久久国产精品 | 色婷婷97 | 国产精品美女久久久 | 99久久国产免费,99久久国产免费大片 | 久久99免费观看 | 久久精品国产精品亚洲 | 日韩字幕在线观看 | 五月婷婷六月综合 | 日日日爽爽爽 | 日韩在线高清视频 | 日韩欧美在线综合网 | 亚洲码国产日韩欧美高潮在线播放 | 欧美成人在线免费观看 | 91视频在线自拍 | 中文字幕91视频 | 激情五月婷婷激情 | 日日爽视频 | av一级片在线观看 | 成年人视频在线免费观看 | 欧美性生活免费看 | 久久在线观看视频 | www.激情五月.com| 美女在线免费视频 | 国产麻豆果冻传媒在线观看 | 五月婷婷综合在线观看 | 日日日天天天 | 黄污视频网站大全 | 色悠悠久久综合 | 在线播放av网址 | 高潮毛片无遮挡高清免费 | 在线免费观看不卡av | 91免费看黄 | 国产伦理一区二区 | 日韩av在线免费播放 | 日韩xxxbbb | 亚洲国产av精品毛片鲁大师 | 黄色免费视频在线观看 | 2019天天干天天色 | 免费的黄色av | 国产精品免费视频网站 | 99视频在线观看免费 | 97精品国产97久久久久久久久久久久 | 久久久久久久久久影院 | 伊人六月 | 国产99精品在线观看 | 在线观看av不卡 | 91精品啪在线观看国产 | 日韩高清成人 | 精品成人网 | 99热精品免费观看 | 在线视频91 | 一区二区三区视频网站 | 精品成人久久 | 中文字幕亚洲精品在线观看 |