青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

那誰的技術博客

感興趣領域:高性能服務器編程,存儲,算法,Linux內核
隨筆 - 210, 文章 - 0, 評論 - 1183, 引用 - 0
數據加載中……

二叉樹遍歷算法集合(前中后序遍歷的遞歸和非遞歸算法,層序遍歷算法)

費了兩天時間寫的,包括前中后序遍歷的遞歸和非遞歸算法,還有層序遍歷總共2*3 + 1 = 7中遍歷二叉樹的算法,感覺其中后序遍歷的非遞歸算法比較困難,想了很久最后的實現還是不夠優雅,請大家指正~~

總共三個文件,一個頭文件,一個對應的cpp文件,還有一個用于測試的文件.

頭文件:
/********************************************************************
????created:????2006/07/04
????filename:?????BinaryTree.h
????author:????????李創
????????????????
http://m.shnenglu.com/converse/

????purpose:????演示二叉樹的算法
********************************************************************
*/


#ifndef?BinaryTree_H
#define?BinaryTree_H

#include?
<stdlib.h>
#include?
<stack>

class?BinaryTree
{
private:
????typedef?
int?Item;
????typedef?
struct?TreeNode
????
{
????????Item????????Node;
????????TreeNode
*???pRight;
????????TreeNode
*???pLeft;

????????TreeNode(Item?node?
=?0,?TreeNode*?pright?=?NULL,?TreeNode*?pleft?=?NULL)
????????????:?Node(node)
????????????,?pRight(pright)
????????????,?pLeft(pleft)
????????
{
????????}


????}
TreeNode,?*PTreeNode;

public:
????
enum?TraverseType
????
{
????????PREORDER????
=?0,????????//?前序
????????INORDER????????=?1,????????//?中序
????????POSTORDER????=?2,????????//?后序
????????LEVELORDER????=?3????????????//?層序
????}
;

????BinaryTree(Item?Array[],?
int?nLength);
????
~BinaryTree();

????PTreeNode?GetRoot()
????
{
????????
return?m_pRoot;
????}


????
//?遍歷樹的對外接口
????
//?指定遍歷類型和是否是非遞歸遍歷,默認是遞歸遍歷
????void?Traverse(TraverseType?traversetype,?bool?bRec?=?true);

private:
????PTreeNode???CreateTreeImpl(Item?Array[],?
int?nLength);
????
void????????DetroyTreeImpl(PTreeNode?pTreenode);

????
void????????PreTraverseImpl(PTreeNode?pTreenode);????????//?遞歸前序遍歷樹
????void????????InTraverseImpl(PTreeNode?pTreenode);????????//?遞歸中序遍歷樹
????void????????PostTraverseImpl(PTreeNode?pTreenode);????????//?遞歸后序遍歷樹

????
void????????NoRecPreTraverseImpl(PTreeNode?pTreenode);????//?非遞歸前序遍歷樹
????void????????NoRecInTraverseImpl(PTreeNode?pTreenode);????//?非遞歸中序遍歷樹
????void????????NoRecPostTraverseImpl(PTreeNode?pTreenode);????//?非遞歸后序遍歷樹

????
void????????LevelTraverseImpl(PTreeNode?pTreenode);

????PTreeNode???m_pRoot;????????
//?根結點

????
//?采用STL里面的stack作為模擬保存鏈表結點的stack容器
????typedef?std::stack<BinaryTree::PTreeNode>?TreeNodeStack;
}
;

#endif


實現文件:
/********************************************************************
????created:????2006/07/04
????filename:?????BinaryTree.cpp
????author:????????李創
????????????????
http://m.shnenglu.com/converse/

????purpose:????演示二叉樹的算法
********************************************************************
*/


#include?
<iostream>
#include?
<assert.h>
#include?
<queue>
#include?
"BinaryTree.h"

BinaryTree::BinaryTree(Item?Array[],?
int?nLength)
????:?m_pRoot(NULL)
{
????assert(NULL?
!=?Array);
????assert(nLength?
>?0);

????m_pRoot?
=?CreateTreeImpl(Array,?nLength);
}


BinaryTree::
~BinaryTree()
{
????DetroyTreeImpl(m_pRoot);
}


//?按照中序遞歸創建樹
BinaryTree::PTreeNode?BinaryTree::CreateTreeImpl(Item?Array[],?int?nLength)
{
????
int?mid?=?nLength?/?2;
????PTreeNode?p?
=?new?TreeNode(Array[mid]);

????
if?(nLength?>?1)
????
{
????????p
->pLeft????=?CreateTreeImpl(Array,?nLength?/?2);
????????p
->pRight???=?CreateTreeImpl(Array?+?mid?+?1,?nLength?/?2?-?1);
????}


????
return?p;
}


void?BinaryTree::DetroyTreeImpl(PTreeNode?pTreenode)
{
????
if?(NULL?!=?pTreenode->pLeft)
????
{
????????DetroyTreeImpl(pTreenode
->pLeft);
????}

????
if?(NULL?!=?pTreenode->pRight)
????
{
????????DetroyTreeImpl(pTreenode
->pRight);
????}


????delete?pTreenode;
????pTreenode?
=?NULL;
}


//?遍歷樹的對外接口
//?指定遍歷類型和是否是非遞歸遍歷,默認是遞歸遍歷
void?BinaryTree::Traverse(TraverseType?traversetype,?bool?bRec?/*=?true*/)
{
????
switch?(traversetype)
????
{
????
case?PREORDER:????//?前序
????????{????????????
????????????
if?(true?==?bRec)
????????????
{
????????????????std::cout?
<<?"遞歸前序遍歷樹\n";
????????????????PreTraverseImpl(m_pRoot);
????????????}

????????????
else
????????????
{
????????????????std::cout?
<<?"非遞歸前序遍歷樹\n";
????????????????NoRecPreTraverseImpl(m_pRoot);
????????????}

????????}

????????
break;

????
case?INORDER:????//?中序
????????{????????????
????????????
if?(true?==?bRec)
????????????
{
????????????????std::cout?
<<?"遞歸中序遍歷樹\n";
????????????????InTraverseImpl(m_pRoot);
????????????}

????????????
else
????????????
{
????????????????std::cout?
<<?"非遞歸中序遍歷樹\n";
????????????????NoRecInTraverseImpl(m_pRoot);
????????????}

????????}

????????
break;

????
case?POSTORDER:????//?后序
????????{????????????
????????????
if?(true?==?bRec)
????????????
{
????????????????std::cout?
<<?"遞歸后序遍歷樹\n";
????????????????PostTraverseImpl(m_pRoot);
????????????}

????????????
else
????????????
{
????????????????std::cout?
<<?"非遞歸后序遍歷樹\n";
????????????????NoRecPostTraverseImpl(m_pRoot);
????????????}

????????}

????????
break;

????
case?LEVELORDER:????//?層序
????????{
????????????std::cout?
<<?"層序遍歷樹\n";
????????????LevelTraverseImpl(m_pRoot);
????????}

????}


????std::cout?
<<?std::endl;
}


//?遞歸前序遍歷樹
void?BinaryTree::PreTraverseImpl(PTreeNode?pTreenode)
{
????
if?(NULL?==?pTreenode)
????????
return;

????std::cout?
<<?"Item?=?"?<<?pTreenode->Node?<<?std::endl;

????PreTraverseImpl(pTreenode
->pLeft);

????PreTraverseImpl(pTreenode
->pRight);
}


//?非遞歸前序遍歷樹
void?BinaryTree::NoRecPreTraverseImpl(PTreeNode?pTreenode)
{
????
if?(NULL?==?pTreenode)
????????
return;

????TreeNodeStack?NodeStack;
????PTreeNode?pNode;
????NodeStack.push(pTreenode);

????
while?(!NodeStack.empty())
????
{
????????
while?(NULL?!=?(pNode?=?NodeStack.top()))????//?向左走到盡頭
????????{
????????????std::cout?
<<?"Item?=?"?<<?pNode->Node?<<?std::endl;????//?訪問當前結點
????????????NodeStack.push(pNode->pLeft);????????????????????//?左子樹根結點入棧
????????}

????????NodeStack.pop();????????????????????????????????????
//?左子樹根結點退棧
????????if?(!NodeStack.empty())
????????
{
????????????pNode?
=?NodeStack.top();
????????????NodeStack.pop();????????????????????????????????
//?當前結點退棧
????????????NodeStack.push(pNode->pRight);????????????????//?當前結點的右子樹根結點入棧
????????}

????}

}


//?中序遍歷樹
//?中序遍歷輸出的結果應該和用來初始化樹的數組的排列順序一致
void?BinaryTree::InTraverseImpl(PTreeNode?pTreenode)
{
????
if?(NULL?==?pTreenode)
????????
return;

????
if?(NULL?!=?pTreenode->pLeft)
????
{
????????InTraverseImpl(pTreenode
->pLeft);
????}


????std::cout?
<<?"Item?=?"?<<?pTreenode->Node?<<?std::endl;

????
if?(NULL?!=?pTreenode->pRight)
????
{
????????InTraverseImpl(pTreenode
->pRight);
????}

}


//?非遞歸中序遍歷樹
void?BinaryTree::NoRecInTraverseImpl(PTreeNode?pTreenode)
{
????
if?(NULL?==?pTreenode)
????????
return;

????TreeNodeStack?NodeStack;
????PTreeNode?pNode;
????NodeStack.push(pTreenode);

????
while?(!NodeStack.empty())
????
{
????????
while?(NULL?!=?(pNode?=?NodeStack.top()))????//?向左走到盡頭
????????{
????????????NodeStack.push(pNode
->pLeft);
????????}


????????NodeStack.pop();

????????
if?(!NodeStack.empty()?&&?NULL?!=?(pNode?=?NodeStack.top()))
????????
{
????????????std::cout?
<<?"Item?=?"?<<?pNode->Node?<<?std::endl;
????????????NodeStack.pop();
????????????NodeStack.push(pNode
->pRight);
????????}

????}

}


//?后序遍歷樹
void?BinaryTree::PostTraverseImpl(PTreeNode?pTreenode)
{
????
if?(NULL?==?pTreenode)
????????
return;

????
if?(NULL?!=?pTreenode->pLeft)
????
{
????????PostTraverseImpl(pTreenode
->pLeft);
????}


????
if?(NULL?!=?pTreenode->pRight)
????
{
????????PostTraverseImpl(pTreenode
->pRight);
????}


????std::cout?
<<?"Item?=?"?<<?pTreenode->Node?<<?std::endl;
}


//?非遞歸后序遍歷樹
void?BinaryTree::NoRecPostTraverseImpl(PTreeNode?pTreenode)
{
????
if?(NULL?==?pTreenode)
????????
return;

????TreeNodeStack?NodeStack;
????PTreeNode?pNode1,?pNode2;
????NodeStack.push(pTreenode);
????pNode1?
=?pTreenode->pLeft;
????
????
bool?bVisitRoot?=?false;????????????//?標志位,是否訪問過根結點
????while?(!NodeStack.empty())
????
{
????????
while?(NULL?!=?pNode1)????????????//?向左走到盡頭
????????{
????????????NodeStack.push(pNode1);
????????????pNode1?
=?pNode1->pLeft;
????????}


????????pNode1?
=?NodeStack.top();
????????NodeStack.pop();

????????
if?(NULL?==?pNode1->pRight)????????????//?如果沒有右子樹就是葉子結點
????????{
????????????std::cout?
<<?"Item?=?"?<<?pNode1->Node?<<?std::endl;
????????????pNode2?
=?pNode1;
????????????pNode1?
=?NodeStack.top();

????????????
if?(pNode2?==?pNode1->pRight)????//?如果這個葉子結點是右子樹
????????????{
????????????????std::cout?
<<?"Item?=?"?<<?pNode1->Node?<<?std::endl;
????????????????NodeStack.pop();
????????????????pNode1?
=?NULL;
????????????}

????????????
else????????????????????????????//?否則訪問右子樹
????????????{
????????????????pNode1?
=?pNode1->pRight;
????????????}

????????}

????????
else????????????????????????????????//?訪問右子樹
????????{
????????????
if?(pNode1?==?pTreenode?&&?true?==?bVisitRoot)????//?如果已經訪問過右子樹那么就退出
????????????{
????????????????std::cout?
<<?"Item?=?"?<<?pNode1->Node?<<?std::endl;
????????????????
return;
????????????}

????????????
else
????????????
{
????????????????
if?(pNode1?==?pTreenode)
????????????????
{
????????????????????bVisitRoot?
=?true;
????????????????}


????????????????NodeStack.push(pNode1);
????????????????pNode1?
=?pNode1->pRight;
????????????}

????????}

????}

}


//?按照樹的層次從左到右訪問樹的結點
void?BinaryTree::LevelTraverseImpl(PTreeNode?pTreenode)
{
????
if?(NULL?==?pTreenode)
????????
return;

????
//?層序遍歷用于保存結點的容器是隊列
????std::queue<PTreeNode>?NodeQueue;
????PTreeNode?pNode;
????NodeQueue.push(pTreenode);

????
while?(!NodeQueue.empty())
????
{
????????pNode?
=?NodeQueue.front();
????????NodeQueue.pop();
????????std::cout?
<<?"Item?=?"?<<?pNode->Node?<<?std::endl;

????????
if?(NULL?!=?pNode->pLeft)
????????
{
????????????NodeQueue.push(pNode
->pLeft);????
????????}

????????
if?(NULL?!=?pNode->pRight)
????????
{
????????????NodeQueue.push(pNode
->pRight);
????????}
????
????}

}

測試文件:
/********************************************************************
????created:????2006/07/04
????filename:?????main.cpp
????author:????????李創
????????????????
http://m.shnenglu.com/converse/

????purpose:????測試二叉樹的算法
********************************************************************
*/


#include?
"BinaryTree.h"

#include?
<stdio.h>
#include?
<stdlib.h>
#include?
<time.h>
#include?
<iostream>

void?DisplayArray(int?array[],?int?length)
{
????
int?i;

????
for?(i?=?0;?i?<?length;?i++)
????
{
????????printf(
"array[%d]?=?%d\n",?i,?array[i]);
????}

}


void?CreateNewArray(int?array[],?int?length)
{
????
for?(int?i?=?0;?i?<?length;?i++)
????
{
????????array[i]?
=?rand()?%?256?+?i;
????}

}


int?main()
{
????
int?array[10];
????srand(time(NULL));

????
//?創建數組
????CreateNewArray(array,?10);
????DisplayArray(array,?
10);

????BinaryTree?
*pTree?=?new?BinaryTree(array,?10);

????
//?測試前序遍歷
????pTree->Traverse(BinaryTree::PREORDER);
????std::cout?
<<?"root?=?"?<<?pTree->GetRoot()->Node?<<?std::endl;
????std::cout?
<<?"root->left?=?"?<<?pTree->GetRoot()->pLeft->Node?<<?std::endl;
????std::cout?
<<?"root->right?=?"?<<?pTree->GetRoot()->pRight->Node?<<?std::endl;
????pTree
->Traverse(BinaryTree::PREORDER,?false);
????
????
//?測試中序遍歷
????pTree->Traverse(BinaryTree::INORDER);
????std::cout?
<<?"root?=?"?<<?pTree->GetRoot()->Node?<<?std::endl;
????std::cout?
<<?"root->left?=?"?<<?pTree->GetRoot()->pLeft->Node?<<?std::endl;
????std::cout?
<<?"root->right?=?"?<<?pTree->GetRoot()->pRight->Node?<<?std::endl;
????pTree
->Traverse(BinaryTree::INORDER,?false);
????
//?測試后序遍歷
????pTree->Traverse(BinaryTree::POSTORDER);
????std::cout?
<<?"root?=?"?<<?pTree->GetRoot()->Node?<<?std::endl;
????std::cout?
<<?"root->left?=?"?<<?pTree->GetRoot()->pLeft->Node?<<?std::endl;
????std::cout?
<<?"root->right?=?"?<<?pTree->GetRoot()->pRight->Node?<<?std::endl;
????pTree
->Traverse(BinaryTree::POSTORDER,?false);
????
//?測試層序遍歷
????pTree->Traverse(BinaryTree::LEVELORDER);

????system(
"pause");
????
????delete?pTree;

????
return?0;
}

posted on 2006-07-08 15:21 那誰 閱讀(20260) 評論(9)  編輯 收藏 引用 所屬分類: 算法與數據結構

評論

# re: 二叉樹遍歷算法集合(前中后序遍歷的遞歸和非遞歸算法,層序遍歷算法)  回復  更多評論   

good
2007-06-16 18:04 | superdaxia

# re: 二叉樹遍歷算法集合(前中后序遍歷的遞歸和非遞歸算法,層序遍歷算法)  回復  更多評論   

你好,我是新手,在用VC調試時發現錯誤
f:\hwh\二叉樹\binarytree.h(64) : error C2027: use of undefined type 'BinaryTree'
f:\hwh\二叉樹\binarytree.h(8) : see declaration of 'BinaryTree'
main.cpp
f:\hwh\二叉樹\binarytree.h(64) : error C2027: use of undefined type 'BinaryTree'
f:\hwh\二叉樹\binarytree.h(8) : see declaration of 'BinaryTree'
執行 cl.exe 時出錯.

二叉樹.exe - 1 error(s), 0 warning(s)
為什么呢?
2007-12-25 11:37 | tomy

# re: 二叉樹遍歷算法集合(前中后序遍歷的遞歸和非遞歸算法,層序遍歷算法)  回復  更多評論   

@tomy
你用的什么編譯器?我用的VS2003,其次,你的工程里面有幾個文件?這里一共有三個文件:binarytree.h,binarytree.cpp,main.cpp
2007-12-26 11:18 | 創系

# re: 二叉樹遍歷算法集合(前中后序遍歷的遞歸和非遞歸算法,層序遍歷算法)[未登錄]  回復  更多評論   

我用DEV C++編譯后報以下信息,請指教:

C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp/cceIaaaa.o(.text+0x52d):main.cpp: undefined reference to `BinaryTree::Traverse(BinaryTree::TraverseType, bool)'
C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp/cceIaaaa.o(.text+0x62f):main.cpp: more undefined references to `BinaryTree::Traverse(BinaryTree::TraverseType, bool)' follow
C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp/cceIaaaa.o(.text+0x676):main.cpp: undefined reference to `BinaryTree::~BinaryTree()'
collect2: ld returned 1 exit status
2008-01-06 01:10 | ben

# re: 二叉樹遍歷算法集合(前中后序遍歷的遞歸和非遞歸算法,層序遍歷算法)  回復  更多評論   

樓上的錯誤是DEV C++的工程文件/配置文件的問題吧?

# re: 二叉樹遍歷算法集合(前中后序遍歷的遞歸和非遞歸算法,層序遍歷算法)[未登錄]  回復  更多評論   

已經解決了,謝謝指點!
2008-01-06 15:19 | ben

# re: 二叉樹遍歷算法集合(前中后序遍歷的遞歸和非遞歸算法,層序遍歷算法)  回復  更多評論   

請問,為什么我的窗口上什么都米有?只有一個“請按任意鍵繼續”,用的是VC++ 2008
2008-07-09 07:03 | liuyu

# re: 二叉樹遍歷算法集合(前中后序遍歷的遞歸和非遞歸算法,層序遍歷算法)  回復  更多評論   

其實如果不用 Stack 而改用 List 的話,三種非遞歸遍歷將變得更加簡單一致,一個 While 就夠了

typedef std::list<BinaryTree::PTreeNode> TreeNodeList;

typedef struct TreeNode
{
Item Node;
TreeNode* pRight;
TreeNode* pLeft;
bool bVisited; // 關鍵

TreeNode(Item node = 0, TreeNode* pright = NULL, TreeNode* pleft = NULL)
: Node(node)
, pRight(pright)
, pLeft(pleft)
, bVisited(false)
{
}

}TreeNode, *PTreeNode;




// 非遞歸前序遍歷樹
void BinaryTree::NoRecPreTraverseImpl(PTreeNode pTreenode)
{
if (NULL == pTreenode)
return;

TreeNodeList NodeList;
PTreeNode pNode;
NodeList.push_front(pTreenode);

while (!NodeList.empty())
{
pNode = NodeList.front();
NodeList.pop_front();

std::cout << "Item = " << pNode->Node << std::endl;

if(pNode->pRight != NULL) NodeList.push_front(pNode->pRight);
if(pNode->pLeft != NULL) NodeList.push_front(pNode->pLeft);
}
}


// 非遞歸中序遍歷樹
void BinaryTree::NoRecInTraverseImpl(PTreeNode pTreenode)
{
if (NULL == pTreenode)
return;

TreeNodeList NodeList;
PTreeNode pNode;
NodeList.push_front(pTreenode);

while (!NodeList.empty())
{
pNode = NodeList.front();

if(pNode->bVisited)
{
NodeList.pop_front();
pNode->bVisited = false; // 為下一次遍歷做準備

std::cout << "Item = " << pNode->Node << std::endl;

if(pNode->pRight != NULL) NodeList.push_front(pNode->pRight);
}
else
{
if(pNode->pLeft != NULL) NodeList.push_front(pNode->pLeft);
pNode->bVisited = true;
}

}
}

// 非遞歸后序遍歷樹
void BinaryTree::NoRecPostTraverseImpl(PTreeNode pTreenode)
{
if (NULL == pTreenode)
return;

TreeNodeList NodeList;
PTreeNode pNode;
NodeList.push_front(pTreenode);

while (!NodeList.empty())
{
pNode = NodeList.front();

if(pNode->bVisited)
{
NodeList.pop_front();
pNode->bVisited = false; // 為下一次遍歷做準備

std::cout << "Item = " << pNode->Node << std::endl;
}
else
{
if(pNode->pRight != NULL) NodeList.push_front(pNode->pRight);
if(pNode->pLeft != NULL) NodeList.push_front(pNode->pLeft);
pNode->bVisited = true;
}

}
}


2008-09-08 22:58 | Godspeed

# re: 二叉樹遍歷算法集合(前中后序遍歷的遞歸和非遞歸算法,層序遍歷算法)[未登錄]  回復  更多評論   

非遞歸后續遍歷修改為:
public static void iterativePostorder(BinaryTree boot) {
Stack<BinaryTree> stack = new Stack<BinaryTree>();
BinaryTree current, pointer=boot;
boolean bVisitRoot = false;//標志是否訪問過根節點
if (boot == null) {
return;
}
stack.push(boot);
current = boot.leftpoiter;
while (!stack.empty()) {
while (current != null) {//向左走到盡頭
stack.push(current);
current = current.leftpoiter;
}
current = stack.peek();
stack.pop();
if ((current.rightpoiter == null)||(pointer == current.rightpoiter)) {
visit(current);
pointer = current;
current = stack.peek();
if (pointer == current.rightpoiter) {
visit(current);
stack.pop();
pointer=current;
current = null;
} else {
current = current.rightpoiter;
}
} else {
if (current == boot && (bVisitRoot == true)) {
visit(current);
return;
} else {
if (current == boot) {
bVisitRoot = true;
}
stack.push(current);
current = current.rightpoiter;
}
}

}

}
2011-07-07 11:12 | hepeng
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            久久精品国产96久久久香蕉| 一区二区在线看| 亚洲一区二区视频在线| 国产精品嫩草久久久久| 国产精品乱码久久久久久| 麻豆成人在线| 欧美综合国产精品久久丁香| 亚洲欧美电影院| 久久精品官网| 久久久久久色| 亚洲高清电影| 亚洲第一视频| 亚洲精品欧美极品| 亚洲一区精品电影| 久久久精品免费视频| 欧美/亚洲一区| 欧美精品导航| 国产区精品在线观看| 国际精品欧美精品| 99一区二区| 欧美一区二区三区电影在线观看| 久久精品国产一区二区三| 欧美α欧美αv大片| 99国产精品| 午夜精品三级视频福利| 免费观看一级特黄欧美大片| 欧美日韩午夜视频在线观看| 国产日韩精品一区二区三区在线| 伊人天天综合| 亚洲性视频网址| 蜜桃av一区二区在线观看| 亚洲精品日本| 久久亚洲国产精品一区二区| 欧美日韩国产美女| 在线观看成人网| 亚洲欧美日韩国产一区二区三区| 欧美日韩国产综合视频在线观看| 国产精品日本欧美一区二区三区| 韩国v欧美v日本v亚洲v| 99国产一区| 欧美成ee人免费视频| 在线亚洲美日韩| 麻豆成人综合网| 国产欧美在线观看| 日韩午夜三级在线| 久久中文字幕一区| 亚洲欧美成人在线| 欧美日韩蜜桃| 99re在线精品| 亚洲第一页中文字幕| 久久精品二区三区| 狠狠88综合久久久久综合网| 久久疯狂做爰流白浆xx| 亚洲网在线观看| 国产精品video| 亚洲性xxxx| 亚洲婷婷免费| 国产精品普通话对白| 亚洲一区二区免费视频| 亚洲高清在线观看| 国产精品高清免费在线观看| 亚洲日本久久| 女同性一区二区三区人了人一| 午夜国产不卡在线观看视频| 国产精品一区二区在线| 亚洲一区二三| 亚洲久久成人| 欧美激情网站在线观看| 亚洲巨乳在线| 91久久黄色| 欧美日韩性视频在线| 99国产精品久久久| 99国产精品自拍| 欧美日韩国产限制| 亚洲天堂激情| 亚洲网站在线播放| 国产精品高清在线| 欧美一区二区三区免费观看| 亚洲一区二区三区精品动漫| 国产精品毛片大码女人 | 国产欧美日韩高清| 久久国产精品毛片| 久久久无码精品亚洲日韩按摩| 国产一区二区精品| 蜜桃av一区二区| 欧美激情精品久久久久| 亚洲尤物精选| 欧美综合第一页| 亚洲精品日韩欧美| 亚洲在线视频网站| 在线精品观看| 在线视频免费在线观看一区二区| 国产美女精品人人做人人爽| 免费人成网站在线观看欧美高清| 欧美精品一区二区三区蜜桃| 午夜精品电影| 久久婷婷国产综合精品青草| 这里是久久伊人| 欧美在线免费观看亚洲| 99在线|亚洲一区二区| 欧美在线免费看| 亚洲午夜激情网站| 乱码第一页成人| 欧美一级二级三级蜜桃| 免费在线亚洲欧美| 欧美一二三视频| 欧美日韩第一区| 欧美岛国激情| 国产日韩在线视频| 99re国产精品| 亚洲片国产一区一级在线观看| 欧美亚洲系列| 亚洲一区二区三区欧美| 久久综合狠狠综合久久激情| 午夜精品偷拍| 欧美视频不卡| 亚洲精品视频一区二区三区| 国产一区二区三区在线播放免费观看 | 欧美国产精品久久| 久久久久久网址| 久久精品中文字幕一区| 久久久久久网址| 久久久精品日韩欧美| 久久午夜av| 欧美黑人多人双交| 亚洲国产综合在线| 亚洲国产天堂网精品网站| 亚洲国产视频a| 亚洲综合欧美日韩| 久久久久久网| 午夜精品在线观看| 亚洲第一免费播放区| 国产精品亚洲第一区在线暖暖韩国| 欧美国产三级| 亚洲成人直播| 久久久夜精品| 久久综合色综合88| 国内精品久久久久久久影视麻豆 | 欧美日韩黄视频| 91久久综合亚洲鲁鲁五月天| 亚洲电影在线看| 美女精品在线| 亚洲国产精品成人精品| 亚洲人成毛片在线播放| 女女同性精品视频| 亚洲国产精品成人| 夜夜嗨av色综合久久久综合网| 欧美国产成人精品| 欧美激情国产日韩精品一区18| 亚洲国产精品久久精品怡红院| 老妇喷水一区二区三区| 亚洲国产高清自拍| 一区二区av在线| 欧美午夜精品电影| 亚洲永久视频| 久久琪琪电影院| 亚洲日本国产| 国产精品久久久久久久久久ktv | 美女诱惑一区| 亚洲精品乱码久久久久久久久 | 欧美高清在线视频| 亚洲精品综合| 国产精品免费一区二区三区在线观看 | 黑人一区二区| 免费欧美视频| 亚洲视频网站在线观看| 久久精品九九| 91久久精品国产91久久| 欧美日韩亚洲91| 久久福利视频导航| 亚洲精品国产精品国自产在线| 亚洲一区中文| 亚洲成人在线免费| 国产精品成人一区二区三区吃奶| 久久国产加勒比精品无码| 亚洲国产高清一区二区三区| 亚洲欧美日韩网| 最新亚洲视频| 国产美女一区二区| 欧美大片第1页| 亚洲欧美日本伦理| 亚洲黄色有码视频| 午夜宅男欧美| 一区二区冒白浆视频| 激情六月婷婷综合| 欧美性大战久久久久久久蜜臀| 久久成人18免费观看| 一区二区三区视频观看| 欧美不卡高清| 久久久久久久国产| 亚洲欧美日本精品| 一区二区三区国产在线| 在线成人小视频| 国产午夜精品一区理论片飘花| 欧美日韩成人在线观看| 久久午夜视频| 欧美一区二区三区另类| 亚洲视频一二区| 99亚洲视频| 日韩网站在线观看|