亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? tree.cpp

?? 順序二叉樹和樹的復制及哈夫曼編碼
?? CPP
字號:

順序二叉樹和樹的復制及哈夫曼編碼     
  


           網絡二班    任文旭    41




#include "Tree.h"
#include<stdlib.h>
#include<iostream.h>


template<class T>
TBinTree<T>::TBinTree()
{
	root=NULL;
	numNodes=0;
}

template<class T>
TBinTree<T>::~TBinTree()
{
	ReleaseAllNodes();
}

template<class T>
TBinTreeNode<T>* TBinTree<T>::SetRoot(TBinTreeNode<T> *rt)
{
	root=rt;
	return root;
}

template<class T>
TBinTreeNode<T>* TBinTree<T>::GetRoot()
{
	return root;
}

/////////////////////////////////////////////////////////////////////////////
template<class T>
long TBinTree<T>::GetLevel(TBinTreeNode<T>* pNode)//獲得節點層號
{
	long level=1;
	TBinTreeNode<T>* p=pNode;
	while(p->Getfather())
	{
		level++;
		p=p->Getfather();
	}
	return level;

}

template<class T>
long TBinTree<T>::GetLeaves(TBinTreeNode<T>** e)//獲得一根樹的子葉指針,返回子葉個數
{  
   	long  cnt=0,nNodes,top=0;
	TBinTreeNode<T>* p;
	nNodes=GetHeight(root);
    if(nNodes<=0) return 0;
   
    TBinTreeNode<T>** stack=new TBinTreeNode<T>*[nNodes+1]; 
	if(stack==NULL) exit(0);

	p=root;
	while(p!=NULL ||top!=0)
	{
		if(p!=NULL)
		{
          if(p->GetSon(1)==NULL && p->GetSon(2)==NULL)
			  e[cnt++]=p;
		  top++; stack[top]=p;
		  p=p->GetSon(1);
		}
		else
		{
			p=stack[top];
			top--;
			p=p->GetSon(2);
		}
	}
	delete[] stack;
	return cnt;
}

////////////////////////////////////////////////////////////////////////////////////
template<class T>
long TBinTree<T>::GetHeight(TBinTreeNode<T> * pNode) //獲得樹(子樹)的高度,根為一
{
	long h=1,nNodes;
	long i,r=1,l=1,t=1;
	nNodes=numNodes;
	if(pNode==NULL)
		return 0;
	TBinTreeNode<T>* p=pNode;
    TBinTreeNode<T>** pNodes=new TBinTreeNode<T>*[nNodes+1];
	pNodes[1]=p;
    while(1)
	{
		for(i=r;i<=l;i++)
		{ 
	      if(p->GetSon(1)!=NULL)
              pNodes[t++]=p->GetSon(1);
		  if(p->GetSon(2)!=NULL)
			  pNodes[t++]=p->GetSon(2); 
		  p=pNodes[i];
		}
	  
	   if(l==t) break;
        r=l+1;l=t;  ++h;
	}
	return h;
}

template<class T>
long TBinTree<T>::GetNumSubNodes(TBinTreeNode<T> * pNode)//獲得以pNOde為根的樹的子孫個數
{
	long  cnt=0,nNodes,top=0;
	TBinTreeNode<T>* p;
	nNodes=GetHeight(pNode);
    if(nNodes<=0) return 0;
   
    TBinTreeNode<T>** stack=new TBinTreeNode<T>*[nNodes+1]; 
	if(stack==NULL) exit(0);

	p=pNode;
	while(p!=NULL ||top!=0)
	{
		if(p!=NULL)
		{
          cnt++;
		  top++; stack[top]=p;
		  p=p->GetSon(1);
		}
		else
		{
			p=stack[top];
			top--;
			p=p->GetSon(2);
		}
	}
	delete[] stack;
	return cnt;
}


////////////////////////////////////////////////cluster in different ways;
template<class T>
long TBinTree<T>::Cluster(TBinTreeNode<T>* pNode,T** es,TTraverseMode tm)//按指定方式遍歷樹
{
	long t,i=0;
	TBinTreeNode<T>** e=new TBinTreeNode<T>*[numNodes];
	t=Cluster(pNode,e,tm);
	for(i=0;i<numNodes;i++)
      es[i]=&(e[i]->GetElem());
	delete[] e;
	return t;
}

template<class T>
long TBinTree<T>::Cluster(TBinTreeNode<T>* pNode,TBinTreeNode<T>** e,TTraverseMode tm)
{
  switch(tm){
	case preorder:return PreOrder(pNode,e);
	case inorder: return InOrder(pNode,e);
	case postorder:return PostOrder(pNode,e);
	case levelorder:return LevelOrder(pNode,e);
	}
  return 0;
} 
/////////////////////////////////////////////////////////////////////////////////
template<class T> 
long TBinTree<T>::PreOrder(TBinTreeNode<T>* pNode,TBinTreeNode<T>** e)//前序遍歷
{
	long  cnt=0,nNodes,top=0;
	TBinTreeNode<T>* p;
	nNodes=GetHeight(pNode);
//	cout<<nNodes<<endl;
    if(nNodes<=0) return 0;
   
    TBinTreeNode<T>** stack=new TBinTreeNode<T>*[nNodes+1]; 
	if(stack==NULL) exit(0);

	p=pNode;
	while(p!=NULL ||top!=0)
	{
		if(p!=NULL)
		{
          e[cnt++]=p;
		  top++; stack[top]=p;
		  p=p->GetSon(1);
		}
		else
		{
			p=stack[top];
			top--;
			p=p->GetSon(2);
		}
	}
	delete[] stack;
	return cnt;
}

template<class T>
long TBinTree<T>::InOrder(TBinTreeNode<T>* pNode,TBinTreeNode<T>** e)//中序遍歷
{
	long  cnt=0,nNodes,top=0;
	TBinTreeNode<T>* p;
	nNodes=GetHeight(pNode);
//	cout<<nNodes<<endl;
    if(nNodes<=0) return 0;
   
    TBinTreeNode<T>** stack=new TBinTreeNode<T>*[nNodes+1]; 
	if(stack==NULL) exit(0);

	p=pNode;
	while(p!=NULL ||top!=0)
	{
		
		if(p!=NULL)
		{ top++; stack[top]=p;
		  p=p->GetSon(1);
		}
		else
		{
			p=stack[top];
			top--;
			e[cnt++]=p;
			p=p->GetSon(2);
		}
	}
	delete[] stack;
	return cnt;
}

template<class T>
long TBinTree<T>::PostOrder(TBinTreeNode<T>* pNode,TBinTreeNode<T>** pNodes)//后序遍歷
{
  long cnt=0,nNodes,top=0;
  TBinTreeNode<T>* p;

  if(pNode==NULL) return 0;
  nNodes=GetHeight(pNode);
  if(nNodes<=0) return 0;

  struct TPostTraverseStackNode
  {
    TBinTreeNode<T>* pNode;
	char isFirst;
  };

  TPostTraverseStackNode*sk2;
  sk2=new TPostTraverseStackNode[nNodes+1];
  if(sk2==NULL) exit(0);

  p=pNode;
  while(p!=NULL || top!=0)
  {
	  if(p!=NULL)
	  {
		  top++;
		  sk2[top].pNode=p;
		  sk2[top].isFirst=1;
		  p=p->GetSon(1);
	  }
	  else if(sk2[top].isFirst)
	  {
		  sk2[top].isFirst=0;
		  p=sk2[top].pNode->GetSon(2);
	  }

	  else
	  {
		  p=sk2[top].pNode;
		  top--;
		  pNodes[cnt++]=p;
		  p=NULL;
	  }
  }
  delete[] sk2;
  return cnt;
}

template<class T>
long TBinTree<T>::LevelOrder(TBinTreeNode<T>* pNode,TBinTreeNode<T>** e)//層序遍歷
{
	long cnt=0,nNodes;
    TBinTreeNode<T>*p=pNode;
    TBinTreeNode<T>* t;

    TBinTreeNode<T>** queue=new TBinTreeNode<T>*[numNodes];
	if(queue==NULL) exit(0);
	for(int i=0;i<numNodes;i++)
		queue[i]=0;
    
	nNodes=1;
	queue[0]=p;

	while(1)
	{
	  e[cnt]=queue[cnt];
	  cnt++;
	  if((cnt!=1) && (queue[cnt]==0)) break;

	  if((t=p->GetSon(1))!=NULL)
		  queue[nNodes++]=t;
	  if((t=p->GetSon(2))!=NULL)
		  queue[nNodes++]=t;
	  p=queue[cnt];
	}
	delete[] queue;
   return --cnt;

}
///////////////////////////////////////////////////////////////////////////////
template<class T>
long TBinTree<T>::ClusterAncestors(TBinTreeNode<T>* pNode,T**e)//功能還沒實現
{
	return 0;//not actualize yet
}

template<class T>
long TBinTree<T>::ClusterAncestors(TBinTreeNode<T>* pNode,TBinTreeNode<T>** pe)
{
	return 0;//not actualize yet
}

template<class T>
long TBinTree<T>::ClusterDescendants(TBinTreeNode<T>* pNode,T** es)
{
	return 0;//not actualize yet
}

template<class T>
long TBinTree<T>::ClusterDescendants(TBinTreeNode<T>* pNode,TBinTreeNode<T>** pe)
{
	return 0;//not actualize yet
}

template<class T>
long TBinTree<T>::ClusterSeniors(TBinTreeNode<T>* pNode,TBinTreeNode<T>** pe)
{
	return 0;//not actualize yet
}

template<class T>
long TBinTree<T>::ClusterSeniors(TBinTreeNode<T>* pNode,T** es)
{
	return 0;//not actualize yet
}

template<class T>
long TBinTree<T>::ClusterJuniors(TBinTreeNode<T>* pNode,TBinTreeNode<T>** pe)
{
	return 0;//not actualize yet
}

template<class T>
long TBinTree<T>::ClusterJuniors(TBinTreeNode<T>* pNode,T** es)
{
	return 0;//not actualize yet
}

///////////////////////////////////////////////////////////////////////////
template<class T>
void TBinTree<T>::DeleteSubTree(TBinTreeNode<T>* pNode,int sonNo)//刪除子樹
{
	TBinTreeNode<T>* p=pNode->GetSon(sonNo);
	long nNodes=GetNumSubNodes(p);
	TBinTreeNode<T>** e=new TBinTreeNode<T>*[nNodes];
    Cluster(p,e,preorder);
    for(int i=0;i<nNodes;i++)
	  delete e[i];
	pNode->SetSon(sonNo,NULL);
    delete[] e;
}

template<class T>
void TBinTree<T>::ReleaseAllNodes()//釋放所有樹節點
{
  TBinTreeNode<T>** e=new TBinTreeNode<T>*[numNodes];
  Cluster(root,e,preorder);
  for(int i=0;i<numNodes;i++)
	  delete e[i];
  root=NULL;
  numNodes=0;
  delete[] e;
}

/////////////////////////////////////////////////////////////////////////////
template<class T>
TBinTreeNode<T>* TBinTree<T>::Locate(TBinTreeNode<T>* rt,T& e,long sn)//定位
{
    long  nNodes,top=0;
    long n=0;	
	nNodes=GetHeight(rt);
    if(nNodes<=0) return 0;
    TBinTreeNode<T>* p;
    TBinTreeNode<T>** stack=new TBinTreeNode<T>*[nNodes+1]; 
	if(stack==NULL) exit(0);

	p=rt;
	while(p!=NULL ||top!=0)
	{
		if(p!=NULL)
		{
	
		 if(p->GetElem()==e)
		 {   
			 n++;
			if(n==sn)
			  return p;
		 }
		  top++; stack[top]=p;
		  p=p->GetSon(1);
		}
		else
		{
			p=stack[top];
			top--;
			p=p->GetSon(2);
		}
	}
	
	return NULL;
}

template<class T>
TBinTreeNode<T>* TBinTree<T>::GListToTree(long * gListExp,T* es,long numElem) //lists to tree;
{
	return NULL; //not actualize yet
}

template<class T>
long TBinTree<T>::TreeToGList(TBinTreeNode<T> * rt,T* e)// tree to lists;
{
	return 0; //not actualize yet
}

template<class T>
TBinTreeNode<T>* TBinTree<T>::PreOrderExToTree(T* nodes,int numElem)// preorder extention to tree;
{
	return NULL; //not actualize yet
}

///////////////////////////////////////////////////////////////////////////////////////////
template<class T>
TBinTreeNode<T>* TBinTree<T>::InPreToTree(T* pa ,T* ia,long p1,long p2,long i1,long i2)//按前序遍歷和中序遍歷結果構造樹
{
   long k;
   TBinTreeNode<T>* p;
   
   if(i1>i2) return NULL;
   k=0;
   while(pa[p1]!=ia[i1+k]) k++;

   p=new TBinTreeNode<T>;
   p->SetElem(pa[p1]);
   p->SetSon(1,InPreToTree(pa,ia,p1+1,p1+k,i1,i1+k-1));
   p->SetSon(2,InPreToTree(pa,ia,p1+k+1,p2,i1+k+1,i2));

   if(p->GetSon(1)!=NULL) 
	   p->GetSon(1)->Setfather(p);
   if(p->GetSon(2)!=NULL)
	   p->GetSon(2)->Setfather(p);
   root=p;
   numNodes=p2-p1+1;
   return p;
}

template<class T>
void TBinTree<T>::Print(TBinTreeNode<T>* rt,TTraverseMode mode)//按不同遍歷方式打印樹節點
{	TBinTreeNode<T>** e=new TBinTreeNode<T>*[numNodes];
	Cluster(root,e,mode);
	for(int i=0;i<numNodes;i++)
		cout<<e[i]->GetElem()<<"   ";
	cout<<endl;
	delete[] e;
}

///////////////////////////////////////////////////////////////////////////////////////
template<class T>
void TBinTree<T>::Copy(TBinTree<T>& atree)//復制一棵二叉樹,以rt為樹根
{
	long cnt=0;
	atree.SetRoot(CopyTree(root,cnt));
	atree.numNodes=cnt;
}

template<class T>
TBinTreeNode<T>* TBinTree<T>::CopyTree(TBinTreeNode<T>* pNode ,long& n)
{
	T info;
	TBinTreeNode<T>* newNode=new TBinTreeNode<T>;
	info=pNode->GetElem();
	newNode->SetElem(info);
	n++;
	if(pNode->GetSon(1)!=NULL)
	newNode->SetSon(1,CopyTree(pNode->GetSon(1),n));
	else
	newNode->SetSon(1,NULL); 
	if(pNode->GetSon(2)!=NULL)
	newNode->SetSon(2,CopyTree(pNode->GetSon(2),n));
    else
    newNode->SetSon(2,NULL); 
	
	if(newNode->GetSon(1)!=NULL) newNode->GetSon(1)->Setfather(newNode);
    if(newNode->GetSon(2)!=NULL) newNode->GetSon(2)->Setfather(newNode);
	
	return newNode;
}

///////////////////////////////////////////////////////////////////////////////////
bool IsOrderedTree(TBinTree<double>* atree) //判斷一棵樹是否是順序二叉樹
{    
	long nNodes,sign=0;
	long i,r=1,l=1,t=1;
	nNodes=atree->numNodes;
	if(nNodes==0)
		return true;
	TBinTreeNode<double>* p=atree->root;
    TBinTreeNode<double>** pNodes=new TBinTreeNode<double>*[nNodes+1];
	pNodes[1]=p;
    while(1)
	{
		for(i=r;i<=l;i++)
		{ 
	      if(p->GetSon(1)!=NULL)
              pNodes[t++]=p->GetSon(1);
		  else
			  sign=1;
		  if(p->GetSon(2)!=NULL)
		  {
			  if(sign==1)
				  break;
			  pNodes[t++]=p->GetSon(2); 
		  }
		  else if(l==i)    
			   sign=0;
		  p=pNodes[i];
		}
	  
	     if(sign==1) return false;
	     if(l==t) break;
         r=l+1;l=t; 
	}
	return true;
}
/////////////////////////////////////////////////////////////////////////////////
void Huffmancode(TBinTree<double>& tr,long n) //求haffman 編碼
{
	long i,j,height,nleaves,k;
     TBinTreeNode<double>* p;
	TBinTreeNode<double>** leaves=new TBinTreeNode<double>*[n];
     if(leaves==NULL) exit(0);

	nleaves=tr.GetLeaves(leaves);
	height=tr.GetHeight(tr.root);

	double* aa=new double[nleaves*height];
	
	for(i=0;i<nleaves*height;i++)
			aa[i]=2;
   for(i=0;i<nleaves;i++)
   {  
	   j=0;
	   while(1)
	   {
		p=leaves[i]->Getfather();
        if(p!=NULL)
		{   
			k=i*height+j;
			j++;
			if(p->GetSon(1)==leaves[i])
			  aa[k]=0;
		   else
			  aa[k]=1;
		}
		 else  break;
        leaves[i]=p;
	   }
   }

   for(i=0;i<nleaves;i++)
	   for(j=0;j<height;j++)
		   if(aa[i*height+j]!=2)
		    cout<<aa[i*height+j];
		   else
		   {cout<<endl; break;}
}
////////////////////////////////////////////////////////////////////////////////
void main() 
{
	TBinTree<double> myTree;

    cout<<"NO1: decide a bintree whether a ordered bintree"<<endl;

	double arr1[7]={1,2,4,5,3,6,7};
	double arr2[7]={2,5,4,1,3,7,6};
	myTree.InPreToTree(arr1,arr2,0,6,0,6);//用前序遍歷和中序遍歷結果創建一棵二叉樹(非順序二叉樹)
	myTree.Print(myTree.GetRoot());
    
	if(IsOrderedTree(&myTree))                    //調用IsOrderedTree()函數判斷是否是順序二叉樹
		cout<<"Yeah a Ordered Tree!"<<endl;
	else
		cout<<"Not a Ordered Tree!"<<endl;

	TBinTree<double> myTree2;

	double arr11[]={1,2,4,5,3};
	double arr12[]={4,2,5,1,3};
	myTree2.InPreToTree(arr11,arr12,0,4,0,4);//用前序遍歷和中序遍歷結果創建一棵二叉樹(為順序二叉樹)

	myTree2.Print(myTree2.GetRoot());

	if(IsOrderedTree(&myTree2))//調用IsOrderedTree()函數判斷是否是順序二叉樹
		cout<<"Yeah a Ordered Tree!"<<endl;
	else
		cout<<"Not a Ordered Tree!"<<endl;

	TBinTree<double> ACopiedTree;

	cout<<endl<<endl;
    cout<<"NO2:Copying a tree:"<<endl;
	myTree2.Copy(ACopiedTree); //用TBinTree類的一個函數Copy()實現二叉樹的復制
	cout<<"This is a copied tree:"<<endl;
	ACopiedTree.Print(ACopiedTree.GetRoot());//輸出復制的二叉樹的結果,以比較兩棵樹是否一致
    
	cout<<endl;
	cout<<endl;

	cout<<"NO3:Huffman Encoding:"<<endl;

	TBinTree<double> haffmantree;
	double aa[9]={1,2,4,8,9,5,3,6,7}; 
    double bb[9]={8,4,9,2,5,1,6,3,7};
	haffmantree.InPreToTree(aa,bb,0,8,0,8);
	cout<<"This is huffman tree:"<<endl;
	haffmantree.Print(haffmantree.root);

	cout<<"These are Huffman encodings:"<<endl;
	Huffmancode(haffmantree,9);
    
	cout<<endl;
	cout<<"Note: The display of a bintree is in preorder!"<<endl;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲精品第一国产综合野| 97se亚洲国产综合自在线| 国产日韩亚洲欧美综合| 欧美大片一区二区| 亚洲激情第一区| 国产精品一级在线| 国产精品亚洲а∨天堂免在线| 在线一区二区三区四区五区| 日韩一级大片在线| 亚洲永久精品大片| 99国产一区二区三精品乱码| 久久先锋影音av鲁色资源| 性感美女久久精品| 色噜噜久久综合| 中文字幕一区二区三区精华液| 国产精品萝li| 国产美女精品一区二区三区| 成人免费av网站| 久久免费午夜影院| 久久91精品久久久久久秒播| 91精品国产欧美一区二区18| 久久综合狠狠综合久久综合88| 久久青草国产手机看片福利盒子 | 日韩国产一二三区| 日本成人在线不卡视频| 国产精品欧美极品| 久久99国产精品尤物| 337p亚洲精品色噜噜噜| 久久久噜噜噜久久中文字幕色伊伊 | 日韩av一级电影| 欧美视频在线观看一区二区| 亚洲男人天堂一区| 色婷婷综合久久久中文一区二区 | 精品国产凹凸成av人导航| 欧美极品少妇xxxxⅹ高跟鞋| 国产精品99久久久久久久女警 | eeuss鲁片一区二区三区 | 成人黄色一级视频| 欧美综合欧美视频| 亚洲国产精品天堂| 国产成人综合网| 国产精品免费丝袜| 欧美主播一区二区三区| 午夜激情一区二区| 精品久久国产字幕高潮| 国产69精品一区二区亚洲孕妇| 欧美综合天天夜夜久久| 中文字幕免费一区| 一本久久综合亚洲鲁鲁五月天| 日韩一级片在线播放| 国产一区二区久久| 亚洲欧洲性图库| 国产乱子伦视频一区二区三区| 色八戒一区二区三区| 婷婷丁香激情综合| 久久免费视频一区| 色婷婷综合激情| 青青国产91久久久久久| 中文成人av在线| 欧美午夜精品电影| 亚洲三级免费观看| 欧美一级理论片| www.欧美.com| 丝袜亚洲精品中文字幕一区| 国产丝袜欧美中文另类| 欧美日韩国产综合视频在线观看| 综合久久综合久久| 成人国产亚洲欧美成人综合网 | 日韩视频免费观看高清完整版在线观看 | 一区二区免费看| 日韩欧美国产三级电影视频| 波多野结衣中文字幕一区| 午夜激情一区二区三区| 国产精品免费视频观看| 成人小视频在线| 久久人人超碰精品| 欧美男同性恋视频网站| 成人ar影院免费观看视频| 日韩精品欧美精品| 欧美一二三区在线| 91国产精品成人| 国产超碰在线一区| 麻豆精品视频在线观看免费| 亚洲综合免费观看高清完整版在线| 99久久99久久精品免费观看| 精品综合免费视频观看| 亚洲一区二区三区四区五区中文| 欧美亚洲综合色| 成人黄色在线网站| 国产精品一二三| 伦理电影国产精品| 午夜欧美2019年伦理| 樱桃国产成人精品视频| 欧美国产精品久久| 久久综合狠狠综合久久激情| 日韩欧美一二三| 91精品国产综合久久久久久久 | 亚洲综合另类小说| 中文字幕一区二区在线播放| 精品99久久久久久| 欧美一级欧美三级在线观看| 欧美三片在线视频观看| av亚洲精华国产精华| 成人小视频免费在线观看| 亚洲精品综合在线| 日韩美女啊v在线免费观看| 欧美综合一区二区| 欧美私模裸体表演在线观看| 91农村精品一区二区在线| 99亚偷拍自图区亚洲| 丰满白嫩尤物一区二区| 国产乱码精品一区二区三区av| 一区二区三区视频在线看| 欧美精品在线观看播放| 欧美日本在线一区| 欧美日韩亚洲高清一区二区| 欧美中文字幕久久| 欧美亚洲日本一区| 欧美日韩在线直播| 欧美一区永久视频免费观看| 日韩欧美国产三级| 久久久久久一二三区| 国产成人aaa| 日韩欧美精品在线| 欧美变态tickling挠脚心| 精品国产1区2区3区| 国产精品天干天干在线综合| 亚洲人一二三区| 亚洲成精国产精品女| 日韩不卡一二三区| 精品一区二区精品| caoporn国产一区二区| 欧美色成人综合| 日韩精品中文字幕一区二区三区 | 人人爽香蕉精品| 激情综合色综合久久综合| 国产成人免费视频网站高清观看视频 | 成人美女视频在线观看| 免费观看久久久4p| 亚洲国产中文字幕| 免费看欧美美女黄的网站| 国产精品18久久久久久vr| 99久久综合国产精品| 国产伦精品一区二区三区免费迷| 亚洲成人自拍一区| 国产一区三区三区| 在线观看欧美日本| 成人av网站在线观看免费| 欧美日韩精品欧美日韩精品| 日韩欧美在线一区二区三区| 国产精品麻豆99久久久久久| 日本91福利区| 在线视频欧美区| 91啪在线观看| 精品嫩草影院久久| 日韩精品一区二区三区四区| 亚洲日本免费电影| 精品无人码麻豆乱码1区2区| 99re这里都是精品| 精品国产一区二区在线观看| 亚洲视频一二区| 激情文学综合网| 国内精品免费在线观看| 精品一区二区久久| 国产在线视频精品一区| 欧美在线观看禁18| ...xxx性欧美| 国产一区二区三区高清播放| 欧美亚洲国产一区在线观看网站| 在线欧美日韩精品| 久久久精品免费观看| 日韩精品三区四区| 日本高清无吗v一区| 欧美三级三级三级| 国产精品丝袜一区| 国产九色精品成人porny| 91麻豆精品国产自产在线| 亚洲视频每日更新| 成人午夜看片网址| 精品国产一二三区| 男人操女人的视频在线观看欧美| 免费高清在线视频一区·| 国产制服丝袜一区| 宅男噜噜噜66一区二区66| 亚洲香蕉伊在人在线观| 日本不卡不码高清免费观看| 在线看不卡av| 亚洲免费观看在线视频| av中文一区二区三区| 国产拍揄自揄精品视频麻豆| 国产精品免费观看视频| 国产91精品精华液一区二区三区 | wwww国产精品欧美| 全部av―极品视觉盛宴亚洲| 欧美人妖巨大在线| 香蕉乱码成人久久天堂爱免费| 国产最新精品免费| 日本韩国欧美一区| 一区二区不卡在线播放| 欧美中文字幕一二三区视频|