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

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

?? avlnode.h

?? 數據結構課程設計 老師的DEMO,規范編程
?? H
字號:
//this is avl tree node 



template <class T> class avlNode//平衡二叉樹結點類
{
	public:
		avlNode(T val);//構造函數
		avlNode(T val,avlNode<T> *left,avlNode<T> *right,int bf);
		avlNode<T>* copy()const;//復制以當前結點為根的二叉樹 :(寫多了,沒用上)                           
		void release();//刪除以當前結點為根的左右子樹									
		void left(avlNode *);//把當前結點的左指針修改為函數的參數
		avlNode<T>* left()const;//左子結點訪問,返回左結點的指針
		void right(avlNode *v);//把當前結點的右指針修改為函數的參數
		avlNode<T>* right()const;//右子結點訪問,返回右結點的指針
		int add(avlNode<T>* &p,T val);//插入一個值;返回新的avl樹的根結點的指針
		void preorderview(avlNode<T> *current,int i=-1);//前序周游
		avlNode<T>* remove(T val,avlNode<T>* &waste,int &flag);//刪除以當前結點的為根的avl樹中的val結點
		avlNode<T>* findNodeValue(T val);//查找val結點
		T value;//碼值
	private:
		int bf;// balance factor
		avlNode<T>* leftptr;//左右指針
		avlNode<T>* rightptr;
		//avlNode<T>* restoreLeftBalance(int oldbf);//刪除時左子樹失衡的時候調整,返回新的樹根的指針
		//avlNode<T>* restoreRightBalance(int oldbf);//刪除時右子樹失衡的時候調整,返回新的樹根的指針
		avlNode<T>* removeLeftmostElement(avlNode<T>* &childptr,int &flag);//找到最左的結點
		//avlNode<T>* removeBalanceLeft();//從左子樹刪除的時候判斷層數的改變
		//avlNode<T>* removeBalanceRight();//從右子樹刪除的時候判斷層數的改變
		avlNode<T>* LL_singleRotation();//在插入時候左子樹LL失衡的時候調整,返回新的樹根的指針
		avlNode<T>* RR_singleRotation();//在插入時候右子樹RR失衡的時候調整,返回新的樹根的指針
		avlNode<T>* LR_doubleRotation();//在插入時候左子樹LR失衡的時候調整,返回新的樹根的指針
		avlNode<T>* RL_doubleRotation();//在插入時候右子樹RL失衡的時候調整,返回新的樹根的指針
	
};


template <class T> avlNode<T>::avlNode(T val)
{
	value=val;
	leftptr=NULL;
	rightptr=NULL;
	bf=0;
}
template <class T> avlNode<T>::avlNode(T val,avlNode<T> *left,avlNode<T> *right,int bf=0)
{
	value=val;
	leftptr=left;
	rightptr=right;
	bf=bf;
}
template <class T> avlNode<T>* avlNode<T>::copy()const
{
	avlNode<T> *nl,*nr;
	nl=(leftptr==NULL?NULL:leftptr->copy());//遞歸調用復制左子樹
	nr=(rightptr==NULL?NULL:rightptr->copy());//遞歸調用復制右子樹
	avlNode<T>* node=new avlNode<T>(value,nl,nr,bf);
	if(node!=NULL)   //?? ==NULL
		cout<<"error"<<endl;
	else
		return node;
}
template <class T> void avlNode<T>::release()
{
	if (leftptr)
	{//刪除左子樹中的結點
		leftptr->release();//遞歸調用
		delete leftptr;
		leftptr=0;
	}
	if (rightptr)
	{//刪除右子樹中的結點
		rightptr->release();//遞歸調用
		delete rightptr;
		rightptr=0;
	}
}
template <class T> avlNode<T>* avlNode<T>::left()const
{
	return leftptr;
}
template <class T> void avlNode<T>::left(avlNode<T>* v)
{
	leftptr=v;
}
template <class T> avlNode<T>* avlNode<T>::right()const
{
	return rightptr;
}
template <class T> void avlNode<T>::right(avlNode<T>* v)
{
	rightptr=v;
}
template <class T> int avlNode<T>::add(avlNode<T>* &rp,T val)
{//返回值表明以當前結點為根的樹是否再插入之后增高,0:非增高,非0:增高
	if (val<value)
	{//左子樹插入
		if (rp->left()==NULL)
			rp->left(new avlNode<T>(val));
		else if(rp->left()->add(rp->leftptr,val)==0)//插入后子樹沒有增高
			return 0;
		if (rp->bf==-1)
		{//原來已經傾斜,左邊失衡,需要做平衡處理
	       if (rp->left()->bf<0)  //插入在左側,單旋轉
	             rp = LL_singleRotation();
	       else rp = LR_doubleRotation();	//插入在右側,雙旋轉
		   return 0;
		}
		return --bf;   // bf=(0, +1)的情況,不需要調整樹,只要修改bf
	}
	else
	{
		if (rp->right()==NULL)
			rp->right(new avlNode<T>(val));
		else if (rp->right()->add(rp->rightptr,val)==0)//插入后子樹沒有增高 
			return 0;
		if(rp->bf==1)
		{//原來已經傾斜,需要做平衡處理
	       if (rp->right()->bf>0)    //插入在右側,單旋轉
	           rp = RR_singleRotation();
	       else rp = RL_doubleRotation();  //插入點在右側.雙旋轉
		   return 0;
		}
		return ++bf; // bf=(0, -1)的情況,不需要調整樹,只要修改bf
	}
}


template <class T> avlNode<T>* avlNode<T>::remove(T val,avlNode<T>* &waste,int &flag)
{
	if (val==value)
	{
		waste=this;
		//當沒有右子樹的時候返回左子樹
		if(right()==NULL)
		{
			flag=1;
			return left();
		}
		//刪除右子樹中的最小結點
		int oldbf=right()->bf;
		avlNode* newroot;
		right(right()->removeLeftmostElement(newroot,flag));//找到后返回已經平衡的avl樹的根指針
		newroot->left(left());
		newroot->right(right());
		if((flag==1)&&(bf==1))
			flag=1;
		else flag=0;
		if(flag==1)
		{
			newroot->bf=bf--;
		}
		else newroot->bf=bf;
        //左樹的平衡
		avlNode<T>* rightchild=newroot->right();
	    if (rightchild==NULL) 
		    bf--;
	    else if((rightchild->bf!=oldbf)&&(rightchild->bf==0))
		    bf--;
    	if (bf<-1)
		{
		    int newoldbf=newroot->left()->bf;
	        if (newoldbf>0)
			{//雙旋轉
    	       return newroot->LR_doubleRotation();
			}
	        else
			{//單旋轉
		       return newroot->LL_singleRotation();
           	}
		}
	    return newroot;
		
	}
	else if(val<value)
	{//從左子樹中刪除
		if(left()==NULL)
			return this;
		//執行刪除
		int oldbf=left()->bf;
		left(left()->remove(val,waste,flag));//遞歸調用
        //調整左子樹
        avlNode<T>* leftchild=left();
	//	if(flag==1)
	//		bf++;
	    //計算刪除后的子樹對當前的根結點的平衡因子的影響
	    if (leftchild==NULL)
		   bf++;
	    else if((leftchild->bf!=oldbf)&&(leftchild->bf==0))
		   bf++;
	    if (bf>1)//失衡
		{//調整
		   int newoldbf=right()->bf;
	       if (newoldbf<0)//雙旋轉
		   {
	           return RL_doubleRotation();
		   }
	       else
		   {//單旋轉
		       avlNode* temp= RR_singleRotation();
			   if(flag==1)
				   bf++;
			   return temp;
		   }
		}
    	return this;
	}
	else
	{//從右子樹中刪除
		if(right()==NULL)
			return this;
		//執行刪除
		int oldbf=right()->bf;
		right(right()->remove(val,waste,flag));//遞歸調用
		//調整右子樹
		avlNode<T>* rightchild=right();
    	if (rightchild==NULL) 
		  bf--;
	    else if((rightchild->bf!=oldbf)&&(rightchild->bf==0))
		  bf--;
	    if (bf<-1)
		{
		  int newoldbf=left()->bf;
	      if (newoldbf>0)
		  {//雙旋轉
    	      return LR_doubleRotation();
		  }
	      else
		  {//單旋轉
			  avlNode* temp= LL_singleRotation();
			  if(flag==1)
			    bf--;
			   return temp;
		   }
		} 
	    return this;
	}
}

template <class T> avlNode<T>* avlNode<T>::removeLeftmostElement(avlNode<T>* &childptr,int &flag)
{//flag 表示子樹高度是否變化
	avlNode* leftchild=left();
	//找到最小的值,返回,否則遞歸調用
	if (leftchild==NULL)
	{
		childptr=this;
		flag=1;
		return right();
	}
	int oldbf=leftchild->bf;
	left(leftchild->removeLeftmostElement(childptr,flag));//遞歸調用
	//調整左子樹平衡
	avlNode<T>* newleftchild=left();
	//計算刪除后的子樹的高度變化
	if((newleftchild==NULL)&&(right()==NULL))
		flag=1;
	//計算刪除后的子樹對當前的根結點的平衡因子的影響
	if (newleftchild==NULL)
		bf++;
	else if((newleftchild->bf!=oldbf)&&(newleftchild->bf==0))
		bf++;
	if (bf>1)//失衡
	{//調整
		int newoldbf=right()->bf;
	    if (newoldbf<0)//雙旋轉
		{
	       return RL_doubleRotation();
		}
	    else
		{//單旋轉
		   return RR_singleRotation();
		}
	}
	return this;
}


template <class T> avlNode<T>* avlNode<T>::findNodeValue(T val)
{
	if (val==value)
	{
		return this;
	}
	else if (val>value)
	{//大于的話在右子樹中查找
		if (right()!=NULL)
			return right()->findNodeValue(val);//遞歸調用
		else 
			return NULL;
	}
	else
	{//小于的話在左子樹中查找
		if (left()!=NULL)			
			return left()->findNodeValue(val);//遞歸調用
		else
			return NULL;
	}
}
template <class T> void avlNode<T>::preorderview(avlNode<T> *current,int i)
{
	i++;//層計數器
	if (current)
	{
		cout<<setw(8)<<current->value<<setw(10)<<current->bf<<" "<<setw(6)<<i<<endl;
		preorderview(current->left(),i);//遞歸調用
		preorderview(current->right(),i);//遞歸調用
	}
}

template <class T> avlNode<T>* avlNode<T>::LL_singleRotation()
{
	avlNode<T> *p;
	p=left();
	left(p->right());
	bf=0;
	p->right(this);
    if(p->bf==0)
	  p->bf=1;
	else p->bf=0;
	return p;
}

template <class T> avlNode<T>* avlNode<T>::LR_doubleRotation()
{
	avlNode<T> *p,*q;
	q=left();
	p=q->right();
	q->right(p->left());
	left(p->right());
	p->left(q);
	bf=q->bf=0;
	if(p->bf==-1) bf=1;
	if(p->bf==1) q->bf=-1;
	p->right(this);
	p->bf=0;
	return p;
}

template <class T> avlNode<T>* avlNode<T>::RR_singleRotation()
{
	avlNode<T> *p;
	p=right();
	right(p->left());
	bf=0;
	p->left(this);
    if(p->bf==0) 
	  p->bf=-1;
	else p->bf=0;
	return p;
}

template <class T> avlNode<T>* avlNode<T>::RL_doubleRotation()
{
	avlNode<T> *p,*q;
	q=right();
	p=q->left();
	q->left(p->right());
	right(p->left());
	p->right(q);
	bf=q->bf=0;
	if(p->bf==-1) q->bf=1;
	if(p->bf==1) bf=-1;
	p->left(this);
	p->bf=0;
	return p;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产91在线观看丝袜| 日韩亚洲国产中文字幕欧美| 欧美一区在线视频| 亚洲欧美在线aaa| 日本成人中文字幕| 91香蕉视频在线| 欧美成va人片在线观看| 亚洲曰韩产成在线| eeuss鲁片一区二区三区在线观看| 9191国产精品| 亚洲综合久久av| 成人午夜视频福利| 欧美大黄免费观看| 日韩综合一区二区| 欧美系列在线观看| 国产精品久久国产精麻豆99网站| 九九热在线视频观看这里只有精品| 欧美综合久久久| 中文字幕色av一区二区三区| 国产原创一区二区| 精品久久久久久综合日本欧美| 亚洲v中文字幕| 欧美性猛片aaaaaaa做受| 成人欧美一区二区三区| 9i看片成人免费高清| 欧美韩国日本一区| 国产91精品一区二区麻豆亚洲| 日韩视频免费观看高清完整版| 天堂一区二区在线免费观看| 欧美老肥妇做.爰bbww视频| 一区二区三区资源| 欧美视频在线播放| 一个色在线综合| 欧美性大战久久久久久久 | 精品乱人伦一区二区三区| 午夜精品久久久久久久| 欧美日韩成人综合在线一区二区| 偷窥少妇高潮呻吟av久久免费| 91精品黄色片免费大全| 免费观看一级欧美片| 欧美大白屁股肥臀xxxxxx| 九九**精品视频免费播放| 久久蜜桃av一区精品变态类天堂| 国产高清在线观看免费不卡| 国产亚洲一本大道中文在线| 国产成人av影院| 亚洲日本欧美天堂| 欧美午夜精品一区| 精品一区二区综合| 国产精品入口麻豆九色| 99re在线精品| 日韩二区三区在线观看| 欧美一级一级性生活免费录像| 久久精品国产精品亚洲红杏| 精品久久久久久久一区二区蜜臀| 成人免费毛片aaaaa**| 亚洲女女做受ⅹxx高潮| 91精品一区二区三区久久久久久| 国产一区二区三区在线看麻豆| 久久久99免费| 欧美伊人久久久久久久久影院 | 国产一区二区三区黄视频 | 欧美日本在线播放| 麻豆精品视频在线观看视频| 亚洲国产精品v| 欧美色涩在线第一页| 久久66热偷产精品| 樱花影视一区二区| 精品国产免费人成电影在线观看四季 | 精品一区二区成人精品| 国产精品视频一区二区三区不卡| 日本高清视频一区二区| 蜜桃久久精品一区二区| 日韩一区中文字幕| 久久一夜天堂av一区二区三区 | 亚洲视频网在线直播| 欧美日韩国产一区| 国产成人精品免费视频网站| 香蕉久久一区二区不卡无毒影院| 久久久久国产精品免费免费搜索| 在线观看成人小视频| 国产在线国偷精品产拍免费yy| 亚洲免费观看高清完整| 精品av久久707| 欧美视频一区在线观看| 不卡一区二区中文字幕| 日韩av在线播放中文字幕| 自拍偷拍欧美精品| 国产色一区二区| 欧美一区二区三级| 日本高清免费不卡视频| 粉嫩久久99精品久久久久久夜| 日韩成人av影视| 综合久久久久综合| 中文字幕巨乱亚洲| 日韩精品一区二| 欧美一区二区视频免费观看| 91行情网站电视在线观看高清版| 国产精品中文欧美| 秋霞电影网一区二区| 亚洲影院久久精品| 亚洲人xxxx| 综合久久综合久久| 国产精品日日摸夜夜摸av| 久久久久88色偷偷免费| 日韩免费视频线观看| 欧美一级一级性生活免费录像| 欧美日韩视频在线第一区| 在线视频欧美精品| 欧美怡红院视频| 91国在线观看| 欧日韩精品视频| 色综合激情久久| 91久久精品一区二区| 色域天天综合网| 欧美性一二三区| 在线观看国产91| 欧美日韩国产一区| 51精品视频一区二区三区| 欧美日韩国产大片| 欧美日本一区二区| 在线播放中文字幕一区| 欧美一级一区二区| 精品国产髙清在线看国产毛片| 日韩美一区二区三区| 精品久久久三级丝袜| 久久麻豆一区二区| 欧美国产禁国产网站cc| 国产精品欧美一区二区三区| 综合中文字幕亚洲| 亚洲午夜免费视频| 日韩成人精品视频| 国产真实精品久久二三区| 成人小视频免费在线观看| www.爱久久.com| 欧美在线三级电影| 欧美一级片在线看| 国产欧美日韩综合精品一区二区| 国产精品毛片高清在线完整版| 亚洲色图视频免费播放| 日韩电影一二三区| 国产成人精品免费在线| 91小视频在线观看| 欧美日韩成人综合| 国产欧美日韩精品a在线观看| 国产精品久线在线观看| 亚洲成人av一区| 国产一区二区不卡| 色综合天天综合网国产成人综合天 | 欧美一区二区福利视频| 国产日韩欧美综合一区| 亚洲精品ww久久久久久p站| 日本欧美加勒比视频| 国产精品一品视频| 欧美日韩在线播放三区| 久久亚洲二区三区| 亚洲一区二区五区| 国产精品一区在线| 欧美日韩国产一二三| 久久久久久久久久久久电影 | 色偷偷久久人人79超碰人人澡| 欧美日韩在线三级| 国产欧美日韩久久| 美女一区二区在线观看| 91丝袜美女网| 精品国产成人系列| 午夜久久久久久久久久一区二区| 国产精品亚洲成人| 欧美剧情片在线观看| 中文字幕一区不卡| 国产剧情一区在线| 91精品黄色片免费大全| 一区二区三区中文字幕| 高清在线不卡av| 日韩一级片在线观看| 一区二区不卡在线播放| 国产乱码精品一区二区三区五月婷| 欧美猛男超大videosgay| 国产精品美女久久久久久久| 蜜臀国产一区二区三区在线播放| 日本道色综合久久| 中文字幕综合网| 国产精品亚洲午夜一区二区三区 | 久久国产精品区| 欧美日韩国产大片| 一区二区三区在线视频观看58| 国产成人av电影| 2020国产精品自拍| 久久99精品久久久久久动态图| 欧美日韩中文字幕一区二区| 亚洲欧美日韩国产综合| 成人91在线观看| 中文字幕不卡的av| 国产精品自拍在线| 欧美精品一区二| 国产又粗又猛又爽又黄91精品| 日韩亚洲欧美成人一区| 奇米影视7777精品一区二区| 在线电影一区二区三区| 肉色丝袜一区二区|