色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

AVL 樹和普通的二叉查找樹的詳細(xì)區(qū)別分析

算法與數(shù)據(jù)結(jié)構(gòu) ? 2018-01-15 14:36 ? 次閱讀

背景

AVL 樹是一棵平衡的二叉查找樹,于 1962 年,G. M. Adelson-Velsky 和 E. M. Landis 在他們的論文《An algorithm for the organization of information》中發(fā)表。

所謂的平衡之意,就是樹中任意一個(gè)結(jié)點(diǎn)下左右兩個(gè)子樹的高度差不超過 1。(本文對(duì)于樹的高度約定為:空結(jié)點(diǎn)高度是 0,葉子結(jié)點(diǎn)高度是 1。)

那 AVL 樹和普通的二叉查找樹有何區(qū)別呢?如圖,如果我們插入的是一組有序上升或下降的數(shù)據(jù),則一棵普通的二叉查找樹必然會(huì)退化成一個(gè)單鏈表,其查找效率就降為 O(n)。而 AVL 樹因其平衡的限制,可以始終保持 O(logn) 的時(shí)間復(fù)雜度。

具體實(shí)現(xiàn)與代碼分析

在我們進(jìn)行完插入或刪除操作后,很可能會(huì)導(dǎo)致某個(gè)結(jié)點(diǎn)失去平衡,那么我們就需要把失衡結(jié)點(diǎn)旋轉(zhuǎn)一下,使其重新恢復(fù)平衡。

經(jīng)過分析,不管是插入還是刪除,它們都會(huì)有四種失衡的情況:左左失衡,右右失衡,左右失衡,右左失衡。因此每次遇到失衡時(shí),我們只需判斷一下是哪個(gè)失衡,再對(duì)其進(jìn)行相對(duì)應(yīng)的恢復(fù)平衡操作即可。

好,下面以插入操作為例,來看下這四種失衡的廬山真面目。(以下統(tǒng)一約定:紅色結(jié)點(diǎn)為新插入結(jié)點(diǎn),y 結(jié)點(diǎn)為失衡結(jié)點(diǎn))

(1)左左失衡

 AVL 樹和普通的二叉查找樹的詳細(xì)區(qū)別分析

所謂的左左,即 "失衡結(jié)點(diǎn)" 的左子樹比右子樹高 2,左孩子下的左子樹比右子樹高 1。

我們只需對(duì) "以 y 為根的子樹" 進(jìn)行 "左左旋轉(zhuǎn) (ll_rotate)" 即可。一次旋轉(zhuǎn)后,恢復(fù)平衡。

Node * AVL::ll_rotate(Node * y)

{

Node * x = y->left;

y->left = x->right;

x->right = y;

y->height = max(get_height(y->left), get_height(y->right)) + 1;

x->height = max(get_height(x->left), get_height(x->right)) + 1;

return x;

}

(2)右右失衡

所謂的右右,即 "失衡結(jié)點(diǎn)" 的右子樹比左子樹高 2,右孩子下的右子樹比左子樹高 1。

我們只需對(duì) "以 y 為根的子樹" 進(jìn)行 "右右旋轉(zhuǎn) (rr_rotate)" 即可。一次旋轉(zhuǎn)后,恢復(fù)平衡。

Node * AVL::rr_rotate(Node * y)

{

Node * x = y->right;

y->right = x->left;

x->left = y;

y->height = max(get_height(y->left), get_height(y->right)) + 1;

x->height = max(get_height(x->left), get_height(x->right)) + 1;

return x;

}

(3)左右失衡

 AVL 樹和普通的二叉查找樹的詳細(xì)區(qū)別分析

所謂的左右,即 "失衡結(jié)點(diǎn)" 的左子樹比右子樹高 2,左孩子下的右子樹比左子樹高 1。

觀察發(fā)現(xiàn),若先對(duì) "以 x 為根的子樹" 進(jìn)行 "右右旋轉(zhuǎn) (rr_rotate)",此時(shí) "以 y 為根的子樹" 恰好符合 "左左失衡",所以再進(jìn)行一次 "左左旋轉(zhuǎn) (ll_rotate)"。兩次旋轉(zhuǎn)后,恢復(fù)平衡。

Node * AVL::lr_rotate(Node * y)

{

Node * x = y->left;

y->left = rr_rotate(x);

return ll_rotate(y);

}

(4)右左失衡

 AVL 樹和普通的二叉查找樹的詳細(xì)區(qū)別分析

所謂的右左,即 "失衡結(jié)點(diǎn)" 的右子樹比左子樹高 2,右孩子下的左子樹比右子樹高 1。

觀察發(fā)現(xiàn),若先對(duì) "以 x 為根的子樹" 進(jìn)行 "左左旋轉(zhuǎn) (ll_rotate)",此時(shí) "以 y 為根的子樹" 恰好符合 "右右失衡",所以再進(jìn)行一次 "右右旋轉(zhuǎn) (rr_rotate)"。兩次旋轉(zhuǎn)后,恢復(fù)平衡。

Node * AVL::rl_rotate(Node * y)

{

Node * x = y->right;

y->right = ll_rotate(x);

return rr_rotate(y);

}

插入操作

插入成功后,在遞歸回溯時(shí)依次對(duì)經(jīng)過的結(jié)點(diǎn)判斷是否失衡,若失衡就需要對(duì)其進(jìn)行對(duì)應(yīng)的旋轉(zhuǎn)操作使其恢復(fù)平衡,在這期間,原先作為一棵子樹的根結(jié)點(diǎn)就會(huì)因?yàn)樾D(zhuǎn)被替換,因此設(shè)置insert_real( )返回的是新根結(jié)點(diǎn),這樣就可以實(shí)時(shí)更新根結(jié)點(diǎn)。

插入操作實(shí)現(xiàn)代碼如下:

int AVL::get_height(Node * node)

{

if (node == nullptr)

return 0;

return node->height;

}

int AVL::get_balance(Node * node)

{

if (node == nullptr)

return 0;

return get_height(node->left) - get_height(node->right);

}

Node * AVL::insert_real(int key, Node * node)

{

if (node == nullptr)

return new Node(key);

if (key < node->key)

node->left = insert_real(key, node->left);

else if (key > node->key)

node->right = insert_real(key, node->right);

else

return node;

node->height = max(get_height(node->left), get_height(node->right)) + 1;

int balance = get_balance(node);

// 左左失衡

if (balance > 1 && get_balance(node->left) > 0)

return ll_rotate(node);

// 右右失衡

if (balance < -1 && get_balance(node->right) < 0)

return rr_rotate(node);

// 左右失衡

if (balance > 1 && get_balance(node->left) < 0)

return lr_rotate(node);

// 右左失衡

if (balance < -1 && get_balance(node->right) > 0)

return rl_rotate(node);

return node;

}

void AVL::insert(int key)

{

header->left = insert_real(key, header->left);

}

查找操作

Node * AVL::find_real(int key, Node * node)

{

if (node == nullptr)

return nullptr;

if (key < node->key)

return find_real(key, node->left);

else if (key > node->key)

return find_real(key, node->right);

else

return node;

}

Node * AVL::find(int key)

{

return find_real(key, header->left);

}

刪除操作

刪除操作的四種失衡情況和插入操作一樣,讀者可以參考前文。下面是刪除操作的實(shí)現(xiàn)代碼:

Node * AVL::erase_real(int key, Node * node)

{

if (node == nullptr)

return node;

if (key < node->key)

node->left = erase_real(key, node->left);

else if (key > node->key)

node->right = erase_real(key, node->right);

else

{

if (node->left && node->right)

{

// 找到后繼結(jié)點(diǎn)

Node * x = node->right;

while (x->left)

x = x->left;

// 后繼直接復(fù)制

node->key = x->key;

// 轉(zhuǎn)化為刪除后繼

node->right = erase_real(x->key, node->right);

}

else

{

Node * t = node;

node = node->left ? node->left : node->right;

delete t;

if (node == nullptr)

return nullptr;

}

}

node->height = max(get_height(node->left), get_height(node->right)) + 1;

int balance = get_balance(node);

// 左左失衡

if (balance > 1 && get_balance(node->left) >= 0) // 需要加等號(hào)

return ll_rotate(node);

// 右右失衡

if (balance < -1 && get_balance(node->right) <= 0) // 需要加等號(hào)

return rr_rotate(node);

// 左右失衡

if (balance > 1 && get_balance(node->left) < 0)

return lr_rotate(node);

// 右左失衡

if (balance < -1 && get_balance(node->right) > 0)

return rl_rotate(node);

return node;

}

void AVL::erase(int key)

{

header->left = erase_real(key, header->left);

}

完整代碼

/**

*

* author : 劉毅(Limer)

* date : 2017-08-17

* mode : C++

*/

#include

#include

using namespace std;

struct Node

{

int key;

int height;

Node * left;

Node * right;

Node(int key = 0)

{

this->key = key;

this->height = 1;

this->left = this->right = nullptr;

}

};

class AVL

{

private:

Node * header;

private:

Node * ll_rotate(Node * y);

Node * rr_rotate(Node * y);

Node * lr_rotate(Node * y);

Node * rl_rotate(Node * y);

void destroy(Node * node);

int get_height(Node * node);

int get_balance(Node * node);

Node * insert_real(int key, Node * node);

Node * find_real(int key, Node * node);

Node * erase_real(int key, Node * node);

void in_order(Node * node);

public:

AVL();

~AVL();

void insert(int key);

Node * find(int key);

void erase(int key);

void print();

};

Node * AVL::ll_rotate(Node * y)

{

Node * x = y->left;

y->left = x->right;

x->right = y;

y->height = max(get_height(y->left), get_height(y->right)) + 1;

x->height = max(get_height(x->left), get_height(x->right)) + 1;

return x;

}

Node * AVL::rr_rotate(Node * y)

{

Node * x = y->right;

y->right = x->left;

x->left = y;

y->height = max(get_height(y->left), get_height(y->right)) + 1;

x->height = max(get_height(x->left), get_height(x->right)) + 1;

return x;

}

Node * AVL::lr_rotate(Node * y)

{

Node * x = y->left;

y->left = rr_rotate(x);

return ll_rotate(y);

}

Node * AVL::rl_rotate(Node * y)

{

Node * x = y->right;

y->right = ll_rotate(x);

return rr_rotate(y);

}

void AVL::destroy(Node * node)

{

if (node == nullptr)

return;

destroy(node->left);

destroy(node->right);

delete node;

}

int AVL::get_height(Node * node)

{

if (node == nullptr)

return 0;

return node->height;

}

int AVL::get_balance(Node * node)

{

if (node == nullptr)

return 0;

return get_height(node->left) - get_height(node->right);

}

Node * AVL::insert_real(int key, Node * node)

{

if (node == nullptr)

return new Node(key);

if (key < node->key)

node->left = insert_real(key, node->left);

else if (key > node->key)

node->right = insert_real(key, node->right);

else

return node;

node->height = max(get_height(node->left), get_height(node->right)) + 1;

int balance = get_balance(node);

// 左左失衡

if (balance > 1 && get_balance(node->left) > 0)

return ll_rotate(node);

// 右右失衡

if (balance < -1 && get_balance(node->right) < 0)

return rr_rotate(node);

// 左右失衡

if (balance > 1 && get_balance(node->left) < 0)

return lr_rotate(node);

// 右左失衡

if (balance < -1 && get_balance(node->right) > 0)

return rl_rotate(node);

return node;

}

Node * AVL::find_real(int key, Node * node)

{

if (node == nullptr)

return nullptr;

if (key < node->key)

return find_real(key, node->left);

else if (key > node->key)

return find_real(key, node->right);

else

return node;

}

Node * AVL::erase_real(int key, Node * node)

{

if (node == nullptr)

return node;

if (key < node->key)

node->left = erase_real(key, node->left);

else if (key > node->key)

node->right = erase_real(key, node->right);

else

{

if (node->left && node->right)

{

// 找到后繼結(jié)點(diǎn)

Node * x = node->right;

while (x->left)

x = x->left;

// 后繼直接復(fù)制

node->key = x->key;

// 轉(zhuǎn)化為刪除后繼

node->right = erase_real(x->key, node->right);

}

else

{

Node * t = node;

node = node->left ? node->left : node->right;

delete t;

if (node == nullptr)

return nullptr;

}

}

node->height = max(get_height(node->left), get_height(node->right)) + 1;

int balance = get_balance(node);

// 左左失衡

if (balance > 1 && get_balance(node->left) >= 0) // 需要加等號(hào)

return ll_rotate(node);

// 右右失衡

if (balance < -1 && get_balance(node->right) <= 0) // 需要加等號(hào)

return rr_rotate(node);

// 左右失衡

if (balance > 1 && get_balance(node->left) < 0)

return lr_rotate(node);

// 右左失衡

if (balance < -1 && get_balance(node->right) > 0)

return rl_rotate(node);

return node;

}

void AVL::in_order(Node * node)

{

if (node == nullptr)

return;

in_order(node->left);

cout << node->key << " ";

in_order(node->right);

}

AVL::AVL()

{

header = new Node(0);

}

AVL::~AVL()

{

destroy(header->left);

delete header;

header = nullptr;

}

void AVL::insert(int key)

{

header->left = insert_real(key, header->left);

}

Node * AVL::find(int key)

{

return find_real(key, header->left);

}

void AVL::erase(int key)

{

header->left = erase_real(key, header->left);

}

void AVL::print()

{

in_order(header->left);

cout << endl;

}

int main()

{

AVL avl;

// test "insert"

avl.insert(7);

avl.insert(2);

avl.insert(1); avl.insert(1);

avl.insert(5);

avl.insert(3);

avl.insert(6);

avl.insert(4);

avl.insert(9);

avl.insert(8);

avl.insert(11); avl.insert(11);

avl.insert(10);

avl.insert(12);

avl.print(); // 1 2 3 4 5 6 7 8 9 10 11 12

// test "find"

Node * p = nullptr;

cout << ((p = avl.find(2)) ? p->key : -1) << endl;? ?//? 2

cout << ((p = avl.find(100)) ? p->key : -1) << endl; // -1

// test "erase"

avl.erase(1);

avl.print(); // 2 3 4 5 6 7 8 9 10 11 12

avl.erase(9);

avl.print(); // 2 3 4 5 6 7 8 10 11 12

avl.erase(11);

avl.print(); // 2 3 4 5 6 7 8 10 12

return 0;

}

起初構(gòu)造的 AVL 樹為下圖:

總結(jié)

和二叉查找樹相比,AVL 樹的特點(diǎn)是時(shí)間復(fù)雜度更穩(wěn)定,但缺點(diǎn)也是很明顯的。

插入操作中,至多需要一次恢復(fù)平衡操作,遞歸回溯的量級(jí)為 O(logn)。有一點(diǎn)需要我們注意,在對(duì)第一個(gè)失衡結(jié)點(diǎn)進(jìn)行恢復(fù)平衡后,遞歸回溯就應(yīng)該立即停止(因?yàn)槭Ш饨Y(jié)點(diǎn)的父親及其祖先們肯定都是處于平衡狀態(tài)的)。

但讓 "遞歸的回溯" 中途停止,不好實(shí)現(xiàn),所以我上面的編碼程序都不可避免的會(huì)繼續(xù)回溯,直到整棵樹的根結(jié)點(diǎn),而這些回溯都是沒有必要的。(謝謝 LLL 的提醒,若在結(jié)點(diǎn)中增設(shè)父親結(jié)點(diǎn),就可以解決遞歸回溯的問題)

刪除操作中,若存在失衡,則至少需要一次恢復(fù)平衡操作,遞歸回溯的量級(jí)亦為 O(logn)。與插入操作不同,當(dāng)對(duì)第一個(gè)失衡結(jié)點(diǎn)恢復(fù)平衡后,它的父親或者是它的祖先們也可能是非平衡的(見下圖,刪除 1),所以刪除操作的回溯很有必要。

沒有參照物對(duì)比的探討是沒有意義的,所以此文就止于此吧,有興趣的朋友可以看下我后面《紅黑樹》及《AVL 樹與紅黑樹的對(duì)比》的文章。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • AVL
    AVL
    +關(guān)注

    關(guān)注

    0

    文章

    14

    瀏覽量

    10039
  • 二叉樹
    +關(guān)注

    關(guān)注

    0

    文章

    74

    瀏覽量

    12324

原文標(biāo)題:一文讀懂 AVL 樹

文章出處:【微信號(hào):TheAlgorithm,微信公眾號(hào):算法與數(shù)據(jù)結(jié)構(gòu)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    二叉查找(GIF動(dòng)圖講解)

    二叉查找(Binary Search Tree),也稱二叉搜索,是指一棵空或者具有下列性質(zhì)
    發(fā)表于 07-29 15:24

    二叉樹層次遍歷算法的驗(yàn)證

    實(shí)現(xiàn)二叉樹的層次遍歷算法,并對(duì)用”A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I)))”創(chuàng)建的二叉樹進(jìn)行測(cè)試。
    發(fā)表于 11-28 01:05 ?2096次閱讀
    <b class='flag-5'>二叉樹</b>層次遍歷算法的驗(yàn)證

    詳解電源二叉樹到底是什么

    作為數(shù)據(jù)結(jié)構(gòu)的基礎(chǔ),分很多種,像 AVL 、紅黑二叉搜索....今天我想分享的是關(guān)于
    的頭像 發(fā)表于 06-06 15:05 ?1w次閱讀
    詳解電源<b class='flag-5'>二叉樹</b>到底是什么

    PCB板設(shè)計(jì)的電源二叉樹分析詳細(xì)資料說明

    本文檔的主要內(nèi)容詳細(xì)介紹的是PCB板設(shè)計(jì)的電源二叉樹分析詳細(xì)資料說明。
    發(fā)表于 07-29 08:00 ?0次下載
    PCB板設(shè)計(jì)的電源<b class='flag-5'>二叉樹</b><b class='flag-5'>分析</b><b class='flag-5'>詳細(xì)</b>資料說明

    C語言二叉樹代碼免費(fèi)下載

    本文檔的主要內(nèi)容詳細(xì)介紹的是C語言二叉樹代碼免費(fèi)下載。
    發(fā)表于 08-27 08:00 ?1次下載

    紅黑(Red Black Tree)是一種自平衡的二叉搜索

    平衡(Balance):就是當(dāng)結(jié)點(diǎn)數(shù)量固定時(shí),左右子樹的高度越接近,這棵二叉樹越平衡(高度越低)。而最理想的平衡就是完全二叉樹/滿二叉樹,高度最小的二叉樹
    的頭像 發(fā)表于 07-01 15:05 ?5700次閱讀
    紅黑<b class='flag-5'>樹</b>(Red Black Tree)是一種自平衡的<b class='flag-5'>二叉</b>搜索<b class='flag-5'>樹</b>

    二叉樹操作的相關(guān)知識(shí)和代碼詳解

    是數(shù)據(jù)結(jié)構(gòu)中的重中之重,尤其以各類二叉樹為學(xué)習(xí)的難點(diǎn)。在面試環(huán)節(jié)中,二叉樹也是必考的模塊。本文主要講二叉樹操作的相關(guān)知識(shí),梳理面試??嫉膬?nèi)容。請(qǐng)大家跟隨小編一起來復(fù)習(xí)吧。 本篇針對(duì)面
    的頭像 發(fā)表于 12-12 11:04 ?2038次閱讀
    <b class='flag-5'>二叉樹</b>操作的相關(guān)知識(shí)和代碼詳解

    二叉樹的前序遍歷非遞歸實(shí)現(xiàn)

    我們之前說了二叉樹基礎(chǔ)及二叉的幾種遍歷方式及練習(xí)題,今天我們來看一下二叉樹的前序遍歷非遞歸實(shí)現(xiàn)。 前序遍歷的順序是, 對(duì)于中的某節(jié)點(diǎn),先遍歷該節(jié)點(diǎn),然后再遍歷其左子樹,最后遍歷其右子
    的頭像 發(fā)表于 05-28 13:59 ?1952次閱讀

    如何修剪二叉搜索

    ? 如果不對(duì)遞歸有深刻的理解,本題有點(diǎn)難。單純移除一個(gè)節(jié)點(diǎn)那還不夠,要修剪! 669. 修剪二叉搜索 ? 給定一個(gè)二叉搜索,同時(shí)給定最小邊界L 和最大邊界 R。通過修剪
    的頭像 發(fā)表于 10-11 14:16 ?1371次閱讀

    二叉排序樹AVL如何實(shí)現(xiàn)動(dòng)態(tài)平衡

    熟悉的二叉樹種類有二叉搜索(排序、查找)、二叉平衡、伸展
    的頭像 發(fā)表于 10-28 17:02 ?1810次閱讀
    <b class='flag-5'>二叉排序樹</b><b class='flag-5'>AVL</b>如何實(shí)現(xiàn)動(dòng)態(tài)平衡

    C語言數(shù)據(jù)結(jié)構(gòu):什么是二叉樹?

    完全二叉樹:完全二叉樹是效率很高的數(shù)據(jù)結(jié)構(gòu)。對(duì)于深度為K,有n個(gè)節(jié)點(diǎn)的二叉樹,當(dāng)且僅當(dāng)每一個(gè)節(jié)點(diǎn)都與深度為K的滿二叉樹中編號(hào)從1至n的節(jié)點(diǎn)一一對(duì)應(yīng)時(shí),稱為完全
    的頭像 發(fā)表于 04-21 16:20 ?2507次閱讀

    怎么就能構(gòu)造成二叉樹呢?

    一直跟著公眾號(hào)學(xué)算法的錄友 應(yīng)該知道,我在二叉樹:構(gòu)造二叉樹登場(chǎng)!,已經(jīng)講過,只有 中序與后序 和 中序和前序 可以確定一顆唯一的二叉樹。前序和后序是不能確定唯一的二叉樹的。
    的頭像 發(fā)表于 07-14 11:20 ?1579次閱讀

    使用C語言代碼實(shí)現(xiàn)平衡二叉樹

    這篇博客主要總結(jié)平衡二叉樹,所以,二叉排序樹知識(shí)不會(huì)提及,但是會(huì)用到。
    的頭像 發(fā)表于 09-21 11:00 ?1093次閱讀

    二叉樹的代碼實(shí)現(xiàn)

    二叉樹的主要操作有遍歷,例如有先序遍歷、中序遍歷、后序遍歷。在遍歷之前,就是創(chuàng)建一棵二叉樹,當(dāng)然,還需要有刪除二叉樹的算法。
    的頭像 發(fā)表于 01-18 10:41 ?1227次閱讀
    <b class='flag-5'>二叉樹</b>的代碼實(shí)現(xiàn)

    C++自定義二叉樹并輸出二叉樹圖形

    使用C++構(gòu)建一個(gè)二叉樹并輸出。
    的頭像 發(fā)表于 01-10 16:29 ?1743次閱讀
    C++自定義<b class='flag-5'>二叉樹</b>并輸出<b class='flag-5'>二叉樹</b>圖形
    主站蜘蛛池模板: 女人高潮特级毛片| 国产一区91| 亚洲AV精品一区二区三区不卡| 果冻传媒最新视频在线观看| 在线国内自拍精品视频| 欧美亚洲日韩国码在线观看| 国产精品18久久久久网站 | 日本久久久久久久做爰片日本 | 99久久精品全部| 涩涩视频下载| 久草色香蕉视频在线| av影音先锋天堂网| 无遮18禁在线永久免费观看挡| 久久re6热在线视频精品66| 99亚洲精品自拍AV成人软件| 网址在线观看你懂我意思吧免费的| 久久AV国产麻豆HD真实乱| GOGOGO高清免费播放| 亚洲成人黄色片| 免费视频国产| 国产高清美女一级a毛片久久w| 伊人久久国产| 日韩欧美 亚洲视频| 九九99国产香蕉视频| 超级乱淫片午夜电影网99| 亚洲精品人成电影网| 欧美丰满少妇久久无码精品| 国产日韩成人内射视频| 92午夜免费福利757| 无套内射无矿码免费看黄| 麻豆区蜜芽区| 国产日韩精品一区二区在线观看 | 潮 喷女王cytherea| 亚洲影院在线播放| 人人看人人看| 九九热在线视频| 东北老妇人70OLDMAN| 在线亚洲视频无码天堂| 天天狠狠色噜噜| 免费人成视频19674不收费| 国产亚洲精品久久久久5区|