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

那誰的技術博客

感興趣領域:高性能服務器編程,存儲,算法,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>
            欧美精品一区二区三区在线播放 | 欧美精品成人91久久久久久久| 国产一区二区三区精品久久久| 久久精品亚洲精品| 久久精品国产免费观看| 在线观看亚洲专区| 亚洲大胆av| 欧美日韩卡一卡二| 午夜激情一区| 一区二区欧美日韩| 亚洲视频在线一区| 一区在线视频| 日韩一级黄色av| 国产亚洲人成a一在线v站| 欧美三级在线| 国产亚洲视频在线观看| 男同欧美伦乱| 欧美日韩美女一区二区| 久久精品国产一区二区三区| 久久亚洲春色中文字幕| 中文亚洲欧美| 久久精品国产v日韩v亚洲 | 亚洲久久一区| 亚洲欧美影院| 亚洲国产婷婷| 亚洲免费影视| 亚洲美女电影在线| 欧美自拍偷拍午夜视频| 一区二区激情| 久久视频在线视频| 午夜精品美女久久久久av福利| 久久琪琪电影院| 欧美一级理论性理论a| 能在线观看的日韩av| 久久99伊人| 欧美性一二三区| 欧美华人在线视频| 国产乱人伦精品一区二区 | 亚洲精品欧美日韩专区| 伊人激情综合| 小嫩嫩精品导航| 亚洲免费影视第一页| 欧美va亚洲va香蕉在线| 久久久综合视频| 国产精品五区| 一区二区三区导航| 99精品国产高清一区二区| 久久综合九色99| 麻豆国产精品一区二区三区| 国产精品香蕉在线观看| 在线播放亚洲| 亚洲欧美日韩在线观看a三区| 99国产精品久久久久老师| 老鸭窝毛片一区二区三区| 久久伊人一区二区| 国产在线乱码一区二区三区| 在线亚洲美日韩| 亚洲女人小视频在线观看| 欧美日韩一区二区免费在线观看| 亚洲国产成人tv| 亚洲欧洲中文日韩久久av乱码| 久久综合久久综合久久综合| 欧美a级理论片| 亚洲国产精品久久久久久女王| 久久久久久亚洲精品杨幂换脸 | 校园春色国产精品| 国产精品亚洲成人| 性欧美长视频| 老巨人导航500精品| 狠狠操狠狠色综合网| 久久精品亚洲一区二区三区浴池 | 欧美尤物巨大精品爽| 亚洲一区二区在线| 好吊一区二区三区| 久久久亚洲午夜电影| 欧美不卡在线视频| 日韩亚洲在线观看| 欧美午夜性色大片在线观看| 亚洲小视频在线观看| 香蕉久久精品日日躁夜夜躁| 国产一区91精品张津瑜| 久久久水蜜桃| 日韩亚洲在线| 久久er99精品| 亚洲日本成人在线观看| 欧美日韩国产成人高清视频| 亚洲视频一区二区免费在线观看| 欧美在线免费视屏| 一区在线电影| 欧美网站在线| 久久久中精品2020中文| 亚洲欧洲精品一区| 欧美伊人久久大香线蕉综合69| 伊人久久婷婷| 欧美午夜精品久久久久久浪潮 | 欧美日韩精品一区视频 | 欧美承认网站| 性8sex亚洲区入口| 亚洲精品久久视频| 国产欧美综合在线| 欧美精品粉嫩高潮一区二区| 亚洲欧美日韩一区在线| 亚洲国产一区二区a毛片| 欧美在线free| 亚洲欧洲精品一区二区三区| 国产精品一区二区三区久久| 你懂的国产精品| 亚洲字幕一区二区| 亚洲精品日韩精品| 另类亚洲自拍| 先锋亚洲精品| 9i看片成人免费高清| …久久精品99久久香蕉国产 | 欧美日韩亚洲国产精品| 久久久一区二区| 性做久久久久久免费观看欧美| 亚洲精品国产品国语在线app| 麻豆精品传媒视频| 欧美一区成人| 亚洲欧美国产不卡| 在线视频精品一区| 91久久精品国产91久久性色| 国产综合激情| 国产精品一二三四| 国产精品xvideos88| 欧美另类高清视频在线| 免费一级欧美片在线播放| 久久国产精品高清| 欧美一区二区在线免费观看| 亚洲午夜三级在线| 一区二区不卡在线视频 午夜欧美不卡在 | 国产一区久久久| 国产日韩精品一区二区三区 | 永久域名在线精品| 欧美日韩国产一区二区三区地区| 久久亚洲捆绑美女| 久久精品夜夜夜夜久久| 香蕉免费一区二区三区在线观看| 亚洲视频免费观看| 亚洲视频精选| 亚洲欧美激情视频在线观看一区二区三区 | 99视频精品在线| 亚洲人成网站精品片在线观看| 尤妮丝一区二区裸体视频| 国语对白精品一区二区| 黄色资源网久久资源365| 国内精品久久久久久久97牛牛| 国模叶桐国产精品一区| 国产主播一区二区三区四区| 激情综合色丁香一区二区| 亚洲国产91| 亚洲国产婷婷| 99天天综合性| 亚洲一区亚洲二区| 久久成人精品| 免费一区视频| 欧美视频在线一区二区三区| 国产精品嫩草久久久久| 国产精品午夜av在线| 国外成人在线视频| 亚洲欧洲日本专区| 亚洲一区二区三区四区视频| 亚洲免费网站| 久久久久久电影| 亚洲电影网站| 亚洲午夜免费福利视频| 久久不见久久见免费视频1| 老司机久久99久久精品播放免费| 欧美久久一区| 国产毛片一区二区| 亚洲福利视频网| 亚洲小说春色综合另类电影| 久久久999精品| 亚洲激情网站免费观看| 亚洲欧美日韩在线播放| 奶水喷射视频一区| 国产精品美女www爽爽爽视频| 国产一区在线播放| 日韩视频不卡中文| 久久精品夜色噜噜亚洲a∨| 亚洲国产老妈| 欧美在线精品一区| 欧美日本中文| 精品动漫av| 亚洲欧美日韩国产成人| 男女精品网站| 亚洲免费一区二区| 欧美日韩第一区日日骚| 激情久久婷婷| 午夜精品久久久久久久久久久久| 免费亚洲婷婷| 午夜在线成人av| 欧美视频四区| 亚洲伦理在线观看| 蜜臀av国产精品久久久久| 亚洲一区网站| 国产精品成人播放| 99亚洲视频| 亚洲国产欧美国产综合一区| 久久精品国产精品亚洲综合 |