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

那誰的技術博客

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

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

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

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

頭文件:
/********************************************************************
????created:????2006/07/04
????filename:?????BinaryTree.h
????author:????????李創
????????????????
http://www.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://www.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://www.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>
            国产亚洲精品一区二区| 欧美三区视频| 尤物yw午夜国产精品视频| 久久精品成人一区二区三区蜜臀| 亚洲免费av片| 国产精品外国| 久久免费国产精品1| 久久久亚洲国产美女国产盗摄| 极品尤物av久久免费看| 美女久久一区| 欧美精品在线免费观看| 亚洲一区二区视频在线| 亚洲欧美日韩天堂| 在线日韩中文| 亚洲午夜三级在线| 激情欧美一区二区三区| 91久久精品www人人做人人爽 | 久久五月激情| 欧美肥婆bbw| 午夜精品国产更新| 久久资源在线| 一区二区不卡在线视频 午夜欧美不卡'| 在线综合+亚洲+欧美中文字幕| 国产女人水真多18毛片18精品视频| 久久久青草青青国产亚洲免观| 欧美日韩网址| 亚洲网站视频福利| 久久福利视频导航| 一区二区三区视频在线观看| 性久久久久久久久久久久| 亚洲高清成人| 午夜电影亚洲| aa级大片欧美三级| 久久精品国产久精国产思思| 一区二区三区欧美亚洲| 久久国产视频网| 亚洲免费视频网站| 欧美母乳在线| 欧美成人精品一区二区| 国产日韩欧美精品在线| 亚洲欧洲在线看| 在线观看日韩一区| 亚洲一区欧美二区| 亚洲美女尤物影院| 久久久水蜜桃| 狼狼综合久久久久综合网| 国产精品视频大全| 亚洲乱码精品一二三四区日韩在线 | 免播放器亚洲一区| 久久精品国产免费看久久精品| 欧美日韩视频在线第一区| 久热精品在线视频| 国产日韩欧美亚洲一区| 一区二区三区回区在观看免费视频| 亚洲激情一区二区三区| 久久久国产精品亚洲一区| 久久福利资源站| 国产精品自拍一区| 亚洲一区二区在线免费观看视频| 夜夜爽99久久国产综合精品女不卡| 久久综合影音| 男男成人高潮片免费网站| 国产一区二区三区四区在线观看| 亚洲欧美精品中文字幕在线| 亚洲综合导航| 国产欧美欧美| 久久本道综合色狠狠五月| 亚洲影视九九影院在线观看| 欧美日韩综合在线| 亚洲淫性视频| 久久福利一区| 亚洲第一天堂无码专区| 欧美777四色影视在线| 亚洲国产精品久久精品怡红院 | 国产精品大片免费观看| a4yy欧美一区二区三区| 亚洲免费在线视频| 国产精品专区h在线观看| 午夜一区在线| 欧美成年人视频| 亚洲精品久久久久久下一站 | 久久综合一区| 亚洲日本欧美天堂| 亚洲综合日韩中文字幕v在线| 国产精品入口日韩视频大尺度| 久久久久久久久久久成人| 久久久久久高潮国产精品视| 欧美成人久久| 中日韩视频在线观看| 国产精品女人网站| 久久精品一区二区国产| 最新热久久免费视频| 亚洲一级影院| 激情亚洲一区二区三区四区| 欧美ed2k| 午夜精品久久久久久久久 | 日韩一级成人av| 国产精品二区在线观看| 欧美在线视频二区| 亚洲人体大胆视频| 久久久久久久一区二区三区| 1024亚洲| 国产久一道中文一区| 麻豆成人91精品二区三区| 这里只有精品视频| 美女在线一区二区| 亚洲一区一卡| 亚洲国产1区| 国产伦精品一区二区三区| 免播放器亚洲一区| 性色av一区二区三区| 日韩午夜在线观看视频| 男男成人高潮片免费网站| 午夜精品国产精品大乳美女| 亚洲韩国精品一区| 国产亚洲欧美日韩在线一区 | 亚洲欧美国产三级| 亚洲区在线播放| 另类av导航| 欧美在线3区| 亚洲一区二区在线观看视频| 亚洲国产成人精品女人久久久| 国产精品嫩草99a| 欧美日本韩国在线| 免费高清在线一区| 久久精品国产69国产精品亚洲| 一区二区三区三区在线| 亚洲风情在线资源站| 久久伊人精品天天| 久久成人免费电影| 亚洲尤物视频网| 亚洲午夜在线视频| 一区二区高清视频在线观看| 亚洲第一精品电影| 精品9999| 精品电影在线观看| 国产亚洲综合精品| 国产视频观看一区| 国产欧美欧美| 国内成+人亚洲+欧美+综合在线| 国产精品一区视频| 国产免费观看久久| 国产精品午夜在线观看| 国产精品区一区二区三| 国产精品视频精品| 国产欧美日韩一区二区三区在线观看| 国产精品久久999| 国产精品福利片| 国产精品国产成人国产三级| 国产精品久久久久久久久婷婷| 国产精品草草| 国产麻豆成人精品| 国产中文一区二区三区| 国内精品久久久久久久影视蜜臀| 狠狠色狠狠色综合日日91app| 黄色日韩网站| 亚洲精品欧美日韩| 亚洲无线视频| 午夜伦欧美伦电影理论片| 久久精品中文| 精品成人一区二区| 国产精品视频99| 国内成人精品一区| 亚洲欧洲一区二区在线观看| 日韩亚洲综合在线| 亚洲欧美在线磁力| 久久亚洲美女| 亚洲国产成人在线| 中文精品在线| 欧美在线观看一区二区| 免费亚洲一区二区| 国产精品久久久久久久午夜| 国产婷婷精品| 99精品视频免费| 先锋影院在线亚洲| 免费久久99精品国产| 亚洲精品久久久久中文字幕欢迎你| 亚洲私人影院| 久久综合色88| 国产精品你懂的在线欣赏| 亚洲第一页中文字幕| 亚洲一级网站| 亚洲高清一区二| 午夜精品区一区二区三| 你懂的视频欧美| 国产日本欧美一区二区| 一区二区欧美日韩视频| 久久综合网络一区二区| 亚洲最新在线视频| 久热精品视频在线观看| 国产精品第一页第二页第三页| 亚洲福利视频网站| 欧美影院在线播放| 夜夜嗨av一区二区三区四季av| 久久久99免费视频| 国产精品日韩欧美综合| 亚洲麻豆视频| 欧美激情亚洲自拍| 久久精品一区二区三区不卡牛牛| 欧美无砖砖区免费|