精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

面試官提到的 AVL 樹,到底是個啥

開發 前端
平衡二叉查找樹的查找思路,與二叉樹是一樣,每次查詢的時候對半分,只查詢一部分,以達到提供效率的目的,插入、刪除也一樣,最大的不同點:每次插入或者刪除之后,需要計算節點高度,然后按需進行調整!

 [[317730]]

了解過平衡二叉樹的朋友們,對它一定有印象,今天阿粉就與大家一起深入了解一下AVL樹!

一、摘要

在上篇文章,我們詳細的介紹了二叉樹的算法以及代碼實踐,我們知道不同的二叉樹形態結構,對查詢效率也會有很大的影響,尤其是當樹的形態結構變成一個鏈條結構的時候,查詢最后一個元素的效率極底,如何解決這個問題呢?

關鍵在于如何最大限度的減小樹的深度,從而提高查詢效率,正是基于這一點,平衡二叉查找樹出現了!

平衡二叉查找樹,算法由Adel'son-Vel'skii和 Landis兩位大神發明,同時也俗稱AVL 樹,來自兩位大神的姓名縮寫,特性如下:

  • 它的左子樹和右子樹都是平衡二叉樹;
  • 且它的左子樹和右子樹的深度之差的絕對值(平衡因子 ) 不超過1;

簡單的說,就是為了保證平衡,當前節點的左子樹、右子樹的高度差不超過1!

廢話也不多說了,直奔主題,算法思路如下!

二、算法思路

平衡二叉查找樹的查找思路,與二叉樹是一樣,每次查詢的時候對半分,只查詢一部分,以達到提供效率的目的,插入、刪除也一樣,最大的不同點:每次插入或者刪除之后,需要計算節點高度,然后按需進行調整!

如何調整呢?主要方法有:左旋轉、右旋轉!

下面我們分別來分析一下插入、刪除的場景調整。

2.1、插入場景

我們來分析一下插入的場景,如下:

場景一

當我們在40的左邊或者右邊插入的時候,也就是50的左邊,只需繞80進行右旋轉,即可達到樹高度差不超過1!

 

 

 

 

場景二

當我們在60的左邊或者右邊插入的時候,也就是50的右邊,需要進行兩次旋轉,先會繞50左旋轉一次,再繞80右旋轉一次,即可達到樹高度差不超過1!

 

 

 

 

場景三

當我們在120的左邊或者右邊插入的時候,也就是90的右邊,只需繞80進行左旋轉,即可達到樹高度差不超過1!

 

 

 

 

場景四

當我們在85的左邊或者右邊插入的時候,也就是90的左邊,需要進行兩次旋轉,先會繞90右旋轉一次,再繞80左旋轉一次,即可達到樹高度差不超過1!

 

 

 

 

總結

對于插入這種操作,總共其實只有這四種類型的插入,即:單次左旋轉、單次右旋轉、左旋轉-右旋轉、右旋轉-左旋轉,總結如下:

  • 當插入節點位于需要旋轉節點的左節點的左子樹時,只需右旋轉;
  • 當插入節點位于需要旋轉節點的左節點的右子樹時,需要左旋轉-右旋轉;
  • 當插入節點位于需要旋轉節點的右節點的右子樹時,只需左旋轉;
  • 當插入節點位于需要旋轉節點的右節點的左子樹時,需要右旋轉-左旋轉;

2.2、刪除場景

接下來,我們分析一下刪除場景!

其實,刪除場景跟二叉樹的刪除思路是一樣的,不同的是需要調整,刪除的節點所在樹,需要層層判斷節點的高度差是否大于1,如果大于1,就進行左旋轉或者右旋轉!

場景一

當刪除的節點,只有左子樹時,直接將左子樹轉移到上層即可!

 

 

 

 

場景二

當刪除的節點,只有右子樹時,直接將右子樹轉移到上層即可!

 

 

 

 

場景三

當刪除的節點,有左、右子樹時,因為當前節點的左子樹的最末端的右子樹或者當前節點的右子樹的最末端的左子樹,最接近當前節點,找到其中任意一個,然后將其內容替換并移除最末端節點,即可實現刪除!

 

 

 

 

總結

第三種場景稍微復雜了一些,但基本都是這么一個套路,與二叉樹不同的是,刪除之后需要判斷樹高,對超過1的進行調整,類似上面插入的左旋轉、右旋轉操作!

三、代碼實踐

接下來,我們從代碼層面來定義一下樹的實體結構,如下:

  1. 1public class AVLNode<E extends Comparable<E>> { 
  2.  2 
  3.  3    /**節點關鍵字*/ 
  4.  4    E key
  5.  5 
  6.  6    /**當前節點樹高*/ 
  7.  7    int height; 
  8.  8 
  9.  9    /**當前節點的左子節點*/ 
  10. 10    AVLNode<E> lChild = null
  11. 11 
  12. 12    /**當前節點的右子節點*/ 
  13. 13    AVLNode<E> rChild = null
  14. 14 
  15. 15    public AVLNode(E key) { 
  16. 16        this.key = key
  17. 17    } 
  18. 18 
  19. 19    @Override 
  20. 20    public String toString() { 
  21. 21        return "AVLNode{" + 
  22. 22                "key=" + key + 
  23. 23                ", height=" + height + 
  24. 24                ", lChild=" + lChild + 
  25. 25                ", rChild=" + rChild + 
  26. 26                '}'
  27. 27    } 
  28. 28} 

我們創建一個算法類AVLSolution,完整實現如下:

  1.   1public class AVLSolution<E extends Comparable<E>> { 
  2.   2 
  3.   3    /**定義根節點*/ 
  4.   4    public AVLNode<E> root = null
  5.   5 
  6.   6    /** 
  7.   7     * 插入 
  8.   8     * @param key 
  9.   9     */ 
  10.  10    public void insert(E key){ 
  11.  11        System.out.println("插入[" + key + "]:"); 
  12.  12        root = insertAVL(key,root); 
  13.  13    } 
  14.  14 
  15.  15    private AVLNode insertAVL(E key, AVLNode<E> node){ 
  16.  16        if(node == null){ 
  17.  17            return new AVLNode<E>(key); 
  18.  18        } 
  19.  19        //左子樹搜索 
  20.  20        if(key.compareTo(node.key) < 0){ 
  21.  21            //當前節點左子樹不為空,繼續遞歸向下搜索 
  22.  22            node.lChild = insertAVL(key,node.lChild); 
  23.  23            //出現不平衡,只會是左子樹比右子樹高,大于1的時候,就進行調整 
  24.  24            if(getHeight(node.lChild) - getHeight(node.rChild) == 2){ 
  25.  25                if(key.compareTo(node.lChild.key) < 0){ 
  26.  26                    //如果插入的節點位于當前節點的左節點的左子樹,進行單次右旋轉 
  27.  27                    node = rotateRight(node); 
  28.  28                }else
  29.  29                    //如果插入的節點位于當前節點的左節點的右子樹,先左旋轉再右旋轉 
  30.  30                    node = rotateLeftRight(node); 
  31.  31                } 
  32.  32            } 
  33.  33        }else if(key.compareTo(node.key) > 0){ 
  34.  34            //當前節點右子樹不為空,繼續遞歸向下搜索 
  35.  35            node.rChild = insertAVL(key,node.rChild); 
  36.  36            //出現不平衡,只會是右子樹比左子樹高,大于1的時候,就進行調整 
  37.  37            if(getHeight(node.rChild) - getHeight(node.lChild) == 2){ 
  38.  38                if(key.compareTo(node.rChild.key) < 0){ 
  39.  39                    //如果插入的節點位于當前節點的右節點的左子樹,先右旋轉再左旋轉 
  40.  40                    node = rotateRightLeft(node); 
  41.  41                }else
  42.  42                    //如果插入的節點位于當前節點的右節點的右子樹,進行單次左旋轉 
  43.  43                    node = rotateLeft(node); 
  44.  44                } 
  45.  45            } 
  46.  46        } else
  47.  47            //key已經存在,直接返回 
  48.  48        } 
  49.  49        //因為節點插入,樹高發生變化,更新節點高度 
  50.  50        node.height = updateHeight(node); 
  51.  51        return node; 
  52.  52    } 
  53.  53 
  54.  54    /** 
  55.  55     * 刪除 
  56.  56     * @param key 
  57.  57     */ 
  58.  58    public void delete(E key){ 
  59.  59        root = deleteAVL(key,root); 
  60.  60    } 
  61.  61 
  62.  62    private AVLNode deleteAVL(E key, AVLNode<E> node){ 
  63.  63        if(node == null){ 
  64.  64            return null
  65.  65        } 
  66.  66        if(key.compareTo(node.key) < 0){ 
  67.  67            //左子樹查找 
  68.  68            node.lChild = deleteAVL(key,node.lChild); 
  69.  69            //可能會出現,右子樹比左子樹高2 
  70.  70            if (getHeight(node.rChild) - getHeight(node.lChild) == 2){ 
  71.  71                node = rotateLeft(node); 
  72.  72            } 
  73.  73        } else if(key.compareTo(node.key) > 0){ 
  74.  74            //右子樹查找 
  75.  75            node.rChild = deleteAVL(key, node.rChild); 
  76.  76            //可能會出現,左子樹比右子樹高2 
  77.  77            if (getHeight(node.lChild) - getHeight(node.rChild) == 2){ 
  78.  78                node = rotateRight(node); 
  79.  79            } 
  80.  80        }else
  81.  81            //找到目標元素,刪除分三種情況 
  82.  82            //1.當前節點沒有左子樹,直接返回當前節點右子樹 
  83.  83            //2.當前節點沒有右子樹,直接返回當前節點右子樹 
  84.  84            //3.當前節點有左子樹、右子樹的時候,尋找當前節點的右子樹的最末端的左子樹,進行替換和移除 
  85.  85            if(node.lChild == null){ 
  86.  86                return node.rChild; 
  87.  87            } 
  88.  88            if(node.rChild == null){ 
  89.  89                return node.lChild; 
  90.  90            } 
  91.  91            //找到當前節點的右子樹的最末端的左子樹,也就是右子樹最小節點 
  92.  92            AVLNode<E> minLChild = searchDeleteMin(node.rChild); 
  93.  93            //刪除最小節點,如果高度變化,進行調整 
  94.  94            minLChild.rChild = deleteMin(node.rChild); 
  95.  95            minLChild.lChild = node.lChild;//將當前節點的左子樹轉移到最小節點上 
  96.  96 
  97.  97            node = minLChild;//覆蓋當前節點 
  98.  98            //因為是右子樹發生高度變低,因此可能需要調整 
  99.  99            if(getHeight(node.lChild) - getHeight(node.rChild) == 2){ 
  100. 100                node = rotateRight(node); 
  101. 101            } 
  102. 102        } 
  103. 103        node.height = updateHeight(node); 
  104. 104        return node; 
  105. 105    } 
  106. 106 
  107. 107    /** 
  108. 108     * 搜索 
  109. 109     * @param key 
  110. 110     * @return 
  111. 111     */ 
  112. 112    public AVLNode<E> search(E key){ 
  113. 113        return searchAVL(key, root); 
  114. 114    } 
  115. 115 
  116. 116    private AVLNode<E> searchAVL(E key, AVLNode<E> node){ 
  117. 117        if(node == null){ 
  118. 118            return null
  119. 119        } 
  120. 120        //左子樹搜索 
  121. 121        if(key.compareTo(node.key) < 0){ 
  122. 122            return searchAVL(key, node.lChild); 
  123. 123        }else if(key.compareTo(node.key) > 0){ 
  124. 124            return searchAVL(key, node.rChild); 
  125. 125        } else
  126. 126            //key已經存在,直接返回 
  127. 127            return node; 
  128. 128        } 
  129. 129    }  
  130. 130 
  131. 131    /** 
  132. 132     * 查找需要刪除的元素 
  133. 133     * @param node 
  134. 134     * @return 
  135. 135     */ 
  136. 136    private AVLNode<E> searchDeleteMin(AVLNode<E> node){ 
  137. 137        if (node == null){ 
  138. 138            return null
  139. 139        } 
  140. 140        while (node.lChild != null){ 
  141. 141            node = node.lChild; 
  142. 142        } 
  143. 143        return node; 
  144. 144    } 
  145. 145 
  146. 146    /** 
  147. 147     * 刪除元素 
  148. 148     * @param node 
  149. 149     * @return 
  150. 150     */ 
  151. 151    private AVLNode<E> deleteMin(AVLNode<E> node){ 
  152. 152        if(node == null){ 
  153. 153            return null
  154. 154        } 
  155. 155        if (node.lChild == null){ 
  156. 156            return node.rChild; 
  157. 157        } 
  158. 158        //移除最小節點 
  159. 159        node.lChild = deleteMin(node.lChild); 
  160. 160        //此時移除的是左節點,判斷是否平衡高度被破壞 
  161. 161        if(getHeight(node.rChild) - getHeight(node.lChild) == 2){ 
  162. 162            //進行調整 
  163. 163            node = rotateLeft(node); 
  164. 164        } 
  165. 165        return node; 
  166. 166 
  167. 167    } 
  168. 168 
  169. 169    /** 
  170. 170     * 單次左旋轉 
  171. 171     * @param node 
  172. 172     * @return 
  173. 173     */ 
  174. 174    private AVLNode<E> rotateLeft(AVLNode<E> node){ 
  175. 175        System.out.println("節點:" + node.key + ",單次左旋轉"); 
  176. 176        AVLNode<E> x = node.rChild;//獲取旋轉節點的右節點 
  177. 177        node.rChild = x.lChild;//將旋轉節點的右節點的左節點轉移,作為旋轉節點的右子樹 
  178. 178        x.lChild = node;//將旋轉節點作為旋轉節點的右子樹的左子樹 
  179. 179 
  180. 180        //更新調整節點高度(先調整旋轉節點node) 
  181. 181        node.height = updateHeight(node); 
  182. 182        x.height = updateHeight(x); 
  183. 183        return x; 
  184. 184    } 
  185. 185 
  186. 186    /** 
  187. 187     * 單次右旋轉 
  188. 188     * @return 
  189. 189     */ 
  190. 190    private AVLNode<E> rotateRight(AVLNode<E> node){ 
  191. 191        System.out.println("節點:" + node.key + ",單次右旋轉"); 
  192. 192        AVLNode<E> x = node.lChild;//獲取旋轉節點的左節點 
  193. 193        node.lChild = x.rChild;//將旋轉節點的左節點的右節點轉移,作為旋轉節點的左子樹 
  194. 194        x.rChild = node;//將旋轉節點作為旋轉節點的左子樹的右子樹 
  195. 195 
  196. 196        //更新調整節點高度(先調整旋轉節點node) 
  197. 197        node.height = updateHeight(node); 
  198. 198        x.height = updateHeight(x); 
  199. 199        return x; 
  200. 200    } 
  201. 201 
  202. 202    /** 
  203. 203     * 左旋轉-右旋轉 
  204. 204     * @param node 
  205. 205     * @return 
  206. 206     */ 
  207. 207    private AVLNode<E> rotateLeftRight(AVLNode<E> node){ 
  208. 208        System.out.println("節點:" + node.key + ",左旋轉-右旋轉"); 
  209. 209        //先對當前節點的左節點進行左旋轉 
  210. 210        node.lChild = rotateLeft(node.lChild); 
  211. 211        //再對當前節點進行右旋轉 
  212. 212        return rotateRight(node); 
  213. 213    } 
  214. 214 
  215. 215    /** 
  216. 216     * 右旋轉-左旋轉 
  217. 217     * @param node 
  218. 218     * @return 
  219. 219     */ 
  220. 220    private AVLNode<E> rotateRightLeft(AVLNode<E> node){ 
  221. 221        System.out.println("節點:" + node.key + ",右旋轉-左旋轉"); 
  222. 222        //先對當前節點的右節點進行右旋轉 
  223. 223        node.rChild = rotateRight(node.rChild); 
  224. 224        return rotateLeft(node); 
  225. 225 
  226. 226    } 
  227. 227 
  228. 228    /** 
  229. 229     * 獲取節點高度,如果為空,等于-1 
  230. 230     * @param node 
  231. 231     * @return 
  232. 232     */ 
  233. 233    private int getHeight(AVLNode<E> node){ 
  234. 234        return node != null ? node.height: -1; 
  235. 235    } 
  236. 236 
  237. 237    /** 
  238. 238     * 更新節點高度 
  239. 239     * @param node 
  240. 240     * @return 
  241. 241     */ 
  242. 242    private int updateHeight(AVLNode<E> node){ 
  243. 243        //比較當前節點左子樹、右子樹高度,獲取節點高度 
  244. 244        return Math.max(getHeight(node.lChild), getHeight(node.rChild)) + 1; 
  245. 245    } 
  246. 246 
  247. 247    /** 
  248. 248     * 前序遍歷 
  249. 249     * @param node 
  250. 250     */ 
  251. 251    public void frontTreeIterator(AVLNode<E> node){ 
  252. 252        if(node != null){ 
  253. 253            System.out.println("key:" + node.key); 
  254. 254            frontTreeIterator(node.lChild);//遍歷當前節點左子樹 
  255. 255            frontTreeIterator(node.rChild);//遍歷當前節點右子樹 
  256. 256        } 
  257. 257    } 
  258. 258 
  259. 259    /** 
  260. 260     * 中序遍歷 
  261. 261     * @param node 
  262. 262     */ 
  263. 263    public void middleTreeIterator(AVLNode<E> node){ 
  264. 264        if(node != null){ 
  265. 265            middleTreeIterator(node.lChild);//遍歷當前節點左子樹 
  266. 266            System.out.println("key:" + node.key); 
  267. 267            middleTreeIterator(node.rChild);//遍歷當前節點右子樹 
  268. 268        } 
  269. 269    } 
  270. 270 
  271. 271    /** 
  272. 272     * 后序遍歷 
  273. 273     * @param node 
  274. 274     */ 
  275. 275    public void backTreeIterator(AVLNode<E> node){ 
  276. 276        if(node != null){ 
  277. 277            backTreeIterator(node.lChild);//遍歷當前節點左子樹 
  278. 278            backTreeIterator(node.rChild);//遍歷當前節點右子樹 
  279. 279            System.out.println("key:" + node.key); 
  280. 280        } 
  281. 281    } 
  282. 282 
  283. 283} 

測試代碼,如下:

  1. 1public class AVLClient { 
  2.  2 
  3.  3    public static void main(String[] args) { 
  4.  4        //創建一個Integer型的數據結構 
  5.  5        AVLSolution<Integer> avlTree = new AVLSolution<Integer>(); 
  6.  6 
  7.  7        //插入節點 
  8.  8        System.out.println("========插入元素========"); 
  9.  9        avlTree.insert(new Integer(100)); 
  10. 10        avlTree.insert(new Integer(85)); 
  11. 11        avlTree.insert(new Integer(120)); 
  12. 12        avlTree.insert(new Integer(60)); 
  13. 13        avlTree.insert(new Integer(90)); 
  14. 14        avlTree.insert(new Integer(80)); 
  15. 15        avlTree.insert(new Integer(130)); 
  16. 16        System.out.println("========中序遍歷元素========"); 
  17. 17 
  18. 18        //中序遍歷 
  19. 19        avlTree.middleTreeIterator(avlTree.root); 
  20. 20        System.out.println("========查找key為100的元素========"); 
  21. 21 
  22. 22        //查詢節點 
  23. 23        AVLNode<Integer> searchResult = avlTree.search(120); 
  24. 24        System.out.println("查找結果:" + searchResult); 
  25. 25        System.out.println("========刪除key為90的元素========"); 
  26. 26 
  27. 27        //刪除節點 
  28. 28        avlTree.delete(90); 
  29. 29        System.out.println("========再次中序遍歷元素========"); 
  30. 30 
  31. 31        //中序遍歷 
  32. 32        avlTree.middleTreeIterator(avlTree.root); 
  33. 33    } 
  34. 34} 

輸出結果如下:

 

 

 

 

四、總結

平衡二叉樹查找樹,俗稱AVL樹,在查詢的時候,操作與普通二叉查找樹上的查找操作相同;插入的時候,每一次插入結點操作最多只需要單旋轉或雙旋轉;如果是動態刪除,刪除之后必須檢查從刪除結點開始到根結點路徑上的所有結點的平衡因子,也就是高度差,如果超過1就需要調整,最多可能需要O(logN)次旋轉。

整體上來說,平衡二叉樹優于普通二叉查找樹!

五、參考

[1] 簡書 - nicktming - 二叉平衡樹: https://www.jianshu.com/p/22c00b3731f5

[2] iteye - Heart.X.Raid - 平衡二叉查找樹 [AVL]: https://www.iteye.com/blog/hxraid-609949

責任編輯:武曉燕 來源: Java極客技術
相關推薦

2025-10-29 07:33:13

2025-10-31 00:00:02

硅光光通信英偉達

2022-04-10 19:26:07

TypeScript類型語法

2024-02-07 12:35:00

React并發模式concurrent

2024-07-12 15:08:23

Python@wraps函數

2024-08-26 14:23:56

2022-09-06 21:38:45

數字人數字孿生

2021-12-16 15:11:59

Facebook天秤幣加密貨幣

2022-05-04 08:38:32

Netty網絡框架

2021-05-11 07:30:58

JNIJavaAPI

2021-01-28 17:41:32

Github網站Pull Reques

2021-03-03 17:26:45

面試Synchronous底層

2024-08-01 17:34:56

Promiseaxios請求

2021-12-26 00:01:51

Log4Shell漏洞服務器

2024-02-01 20:15:37

2013-05-29 10:17:56

Hadoop分布式文件系統

2012-07-25 09:09:46

GNOME OS桌面

2021-12-16 21:13:38

通信網管平臺

2021-05-19 10:44:42

數據庫架構技術

2019-10-28 09:59:26

區塊鏈技術智能
點贊
收藏

51CTO技術棧公眾號

国产老头老太做爰视频| 91福利国产成人精品播放| 欧美性猛交 xxxx| 久久久蜜桃一区二区人| 日日摸夜夜添一区| 色哟哟网站在线观看| 忘忧草在线日韩www影院| 久久久久国色av免费看影院| 国产主播欧美精品| 国产在线一二区| 久久99久久人婷婷精品综合 | 日本三级黄色大片| 精品视频久久| 精品国产伦一区二区三区观看体验| 国产 日韩 欧美在线| av网站在线播放| 国产精品888| 国产精品a久久久久久| 麻豆一区产品精品蜜桃的特点| 国产精品中文字幕亚洲欧美| 日韩欧美一级精品久久| 精品久久久久久中文字幕2017| av在线看片| 国产精品网曝门| 久草一区二区| 亚洲av无码乱码在线观看性色| 日日夜夜精品视频天天综合网| 欧美—级高清免费播放| 国产精品69久久久久孕妇欧美| 牛牛视频精品一区二区不卡| 制服丝袜国产精品| 欧美一级片中文字幕| 国产黄a三级三级三级av在线看| 久久久99精品久久| 国产一区二区免费电影| 国产xxxx在线观看| 久久精品72免费观看| 日本精品免费观看| 九九热国产视频| 中文字幕一区二区精品区| 亚洲三级 欧美三级| 少妇激情一区二区三区视频| 国产精品亚洲欧美日韩一区在线| 91福利社在线观看| 欧美私人情侣网站| 亚洲美女炮图| 精品电影在线观看| 欧美日韩成人免费视频| 丁香花在线电影小说观看| 亚洲激情图片一区| 热久久最新网址| 亚洲资源一区| 一区二区三区中文字幕电影| 佐佐木明希av| 2024最新电影在线免费观看| 亚洲免费大片在线观看| 黄色影视在线观看| 日本孕妇大胆孕交无码| 一区二区免费看| 大荫蒂性生交片| 国产美女一区视频| 性做久久久久久久免费看| 久久久久久久9| 激情国产在线| 色综合夜色一区| 欧美午夜性生活| 久久福利在线| 91麻豆精品国产自产在线观看一区 | 欧美大片国产精品| 国产艳妇疯狂做爰视频| 成人性生交大片免费看96| 欧美成人福利视频| 国模无码视频一区| 婷婷综合一区| 在线国产精品播放| 777777国产7777777| 欧美日韩一区二区国产| 久久全球大尺度高清视频| 色婷婷av国产精品| 日韩电影在线观看网站| 国产精品影片在线观看| 国产高清在线免费| 不卡视频一二三四| 日本在线播放一区| 免费黄色在线| 午夜视频在线观看一区二区三区 | 999精品视频在线观看播放| 亚洲久久久久| 91精品国产精品| 国产精品高清无码| 国产成人av影院| 免费国产一区| 国内精品不卡| 精品人伦一区二区三区蜜桃网站| 东京热加勒比无码少妇| 成人在线视频www| 亚洲国产精品久久久久| 五月婷六月丁香| 精品白丝av| 国产精品久久一区主播| 亚洲第九十九页| 中文幕一区二区三区久久蜜桃| 草草草视频在线观看| 偷拍中文亚洲欧美动漫| 欧美不卡在线视频| 日韩中文字幕有码| 狠狠爱综合网| 成人a在线观看| 性猛交xxxx| 亚洲精品久久嫩草网站秘色| 成年人视频在线免费| 哺乳挤奶一区二区三区免费看| 国产一区二区动漫| 久久久久黄色片| 日韩精品1区2区3区| 国产区一区二区| 操你啦视频在线| 色欧美片视频在线观看| 国产精品日日摸夜夜爽| 天天综合国产| 国产精品视频xxxx| 手机福利小视频在线播放| 欧美国产成人精品| 岳毛多又紧做起爽| 超碰精品在线| 久久91精品国产91久久久| 奴色虐av一区二区三区| proumb性欧美在线观看| 欧美黄网在线观看| 欧美天堂一区| 国产偷国产偷亚洲清高网站| 成人免费看片98| 国产在线乱码一区二区三区| 神马影院一区二区| 亚洲天堂一区二区| 亚洲精品国产精品自产a区红杏吧 亚洲精品国产精品乱码不99按摩 亚洲精品国产精品久久清纯直播 亚洲精品国产精品国自产在线 | 亚洲另类在线制服丝袜| 在线观看高清免费视频| 国产欧美日韩精品一区二区免费| 97国产suv精品一区二区62| 亚洲av综合色区无码一二三区| 国产精品电影一区二区三区| 国产一区二区在线免费播放| 欧美一区二区麻豆红桃视频| 国产成人综合亚洲| 欧美偷拍视频| 欧美性猛交99久久久久99按摩| 亚洲少妇中文字幕| 狠狠综合久久| 国产精品免费一区二区| 福利写真视频网站在线| 亚洲高清不卡av| 日韩免费一二三区| 成人av手机在线观看| 国产高清www| 国产欧美一区二区三区米奇| 91精品国产99久久久久久| 欧美一区二区三区激情| 污片在线观看一区二区| 亚洲av无码一区二区三区观看| 亚洲色诱最新| 欧美一二三区| 国语自产精品视频在线看抢先版结局 | 性生活一级大片| 欧美在线不卡| 国产精品毛片va一区二区三区| 日本高清在线观看| 精品免费视频.| 可以免费在线观看的av| www激情久久| 网站一区二区三区| 婷婷精品进入| 国产传媒一区| 成人欧美大片| 日韩一区视频在线| 国产高清免费av| 欧美日韩国产在线看| 色哟哟精品观看| 加勒比av一区二区| 欧美图片激情小说| 自拍欧美一区| 国产精品永久免费视频| 特级毛片在线| 亚洲欧美制服丝袜| 97人妻精品一区二区三区软件 | 秋霞一区二区| 高清在线视频日韩欧美| 国产最新视频在线| 日韩欧美国产一二三区| 一区二区三区在线观看av| 亚洲欧洲精品一区二区三区 | 中文字幕在线观看一区| 无码国产精品久久一区免费| 另类av一区二区| 欧美aaa在线观看| 欧洲精品一区| 成人性生交xxxxx网站| 日本免费一区二区六区| 色哟哟亚洲精品一区二区| 性一交一乱一伧老太| 日本大香伊一区二区三区| 亚洲天堂黄色片| 久久精品夜色噜噜亚洲aⅴ| 亚洲男人天堂2021| 亚欧成人精品| 国产爆乳无码一区二区麻豆| 欧美视频免费| 精品国产综合| 日本精品在线观看| 国产精品吴梦梦| 看黄在线观看| 欧美黑人巨大精品一区二区| 成年人在线观看| 亚洲加勒比久久88色综合| 国产色综合视频| 欧洲国产伦久久久久久久| 国产一级生活片| 中文字幕日本乱码精品影院| 国产jjizz一区二区三区视频| 成人亚洲一区二区一| 制服丝袜中文字幕第一页| 国产精品永久| 日本午夜激情视频| 综合久久十次| 一区二区三区四区国产| 精品日本12videosex| 精品欧美国产| 国产精品高潮呻吟久久久久| 91九色国产视频| 国产成人久久精品麻豆二区| 欧美中文在线观看| 日韩精品美女| 9.1国产丝袜在线观看| a级片免费在线观看| 欧美成人合集magnet| 黄色网页在线播放| 最近中文字幕日韩精品 | 国产精品欧美日韩一区| 国产欧美亚洲日本| 国产精品色呦| 国产精品亚洲不卡a| 试看120秒一区二区三区| 91精品久久久久久久久不口人| 久九九久频精品短视频| 日本免费久久高清视频| 亚洲校园激情春色| 欧洲亚洲女同hd| 欧美电影免费观看| 国产成人精品免高潮在线观看| 国产资源在线观看入口av| 韩国三级电影久久久久久| 2020日本在线视频中文字幕| 97久久久免费福利网址| 黄在线观看免费网站ktv| 青青精品视频播放| 波多野结衣久久精品| 国产97在线播放| 91精品国产66| 91久久精品美女高潮| 国产亚洲字幕| 国产精品一区二区三区免费观看 | 在线观看成人av| 希岛爱理一区二区三区| 2021国产视频| 亚洲三级国产| 国产真实乱子伦| 欧美aaa在线| 中文字幕12页| 成人av先锋影音| 动漫精品一区二区三区| 国产欧美一二三区| 精品国产大片大片大片| 有坂深雪av一区二区精品| 国产在线视频卡一卡二| 欧美午夜视频一区二区| 亚洲午夜无码久久久久| 91精品国产色综合久久久蜜香臀| 国产福利资源在线| 亚洲国产一区二区三区四区| 国产日韩精品在线看| 久久精品国产一区二区三区| 爱情岛亚洲播放路线| 国产91精品最新在线播放| 中文成人在线| 国内外成人免费视频| 欧美一区二区三区高清视频| 国产高清不卡无码视频| 久久一区二区三区四区五区| а 天堂 在线| 26uuu精品一区二区在线观看| 天堂网av2018| 亚洲国产人成综合网站| 最近中文字幕免费在线观看| 日韩欧美精品三级| 久草在现在线| 九色精品免费永久在线| 户外露出一区二区三区| 亚洲aⅴ日韩av电影在线观看| 日本中文字幕在线一区| 亚洲五月六月| 国产精品综合| 无套内谢丰满少妇中文字幕| 久久综合国产精品| 免费在线观看av网址| 色av一区二区| 亚洲精品国产精品国| 中文字幕精品一区久久久久| av老司机在线观看| 成人在线免费观看视视频| 久操精品在线| 搞av.com| 国产在线不卡一区| 少妇久久久久久久久久| 亚洲一区在线观看视频| 一区二区视频免费| 亚洲免费成人av电影| 国精产品一区一区三区mba下载| 国产精品久久久久久久久久久久| 日韩欧美影院| 日韩精品综合在线| 精品综合免费视频观看| 手机看片福利视频| 欧美小视频在线| 亚洲伦理在线观看| 欧美尺度大的性做爰视频| 99欧美精品| 日韩精品一区二区三区色偷偷| 国产欧美高清| 国产chinese中国hdxxxx| 亚洲精品你懂的| 伊人久久成人网| 中文字幕欧美精品在线| 欧美极品免费| 欧美视频观看一区| 一区二区三区国产在线| 毛茸茸free性熟hd| 亚洲综合一区二区三区| 国产三级小视频| 超碰97人人做人人爱少妇| 亚洲aⅴ网站| 中文字幕在线中文字幕日亚韩一区| 三级精品在线观看| 亚洲色成人网站www永久四虎| 欧美日韩亚洲激情| 日本啊v在线| 日韩av第一页| 成人婷婷网色偷偷亚洲男人的天堂| 日韩欧美在线免费观看视频| 久久精品人人爽人人爽| 亚洲大尺度在线观看| 亚洲日韩中文字幕| 懂色aⅴ精品一区二区三区| 日韩欧美在线观看强乱免费| 蜜臀av一级做a爰片久久| 九一在线免费观看| 在线不卡a资源高清| 久cao在线| 91传媒视频免费| 亚洲午夜av| 少妇真人直播免费视频| 在线观看一区二区精品视频| sese一区| 亚洲自拍小视频免费观看| 国产一区二区三区四区老人| 水蜜桃av无码| 色美美综合视频| 日本天堂在线观看| 51国产成人精品午夜福中文下载| 欧美日韩亚洲国产精品| 国产麻豆xxxvideo实拍| 在线视频国内一区二区| 久热国产在线| 国产另类自拍| 日韩中文字幕亚洲一区二区va在线| 日日操免费视频| 精品久久久久一区| 亚洲黄色中文字幕| 亚洲三区视频| 国产jizzjizz一区二区| 国产成人无码一区二区在线播放| 中文字幕亚洲综合久久筱田步美| 欧美国产亚洲精品| 狠狠97人人婷婷五月| 国产精品你懂的在线| 亚洲精品无码专区| 国产精品久久久| 国产精品大片| 人人人妻人人澡人人爽欧美一区| 91精品欧美久久久久久动漫 | 国产精品porn| caopeng视频| 欧美v国产在线一区二区三区| 女人高潮被爽到呻吟在线观看| 亚洲二区三区四区| 成人激情小说网站| 中文字幕精品一区二区精| 欧美大片欧美激情性色a∨久久| 欧美欧美黄在线二区| 中国老熟女重囗味hdxx| 在线视频一区二区三|