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

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

?? thbstree.cpp

?? 線索二叉搜索樹結點的插入刪除以及樹的打印。
?? CPP
字號:
    
#include<iostream.h>
#include<windows.h>
#include<conio.h>

template <class T> class ThBSTree;

template <class T>
class ThBSTreeNode
{
	friend class ThBSTree<T>;
	private:
		T element;
		int lTag,rTag;
		ThBSTreeNode<T>* left;
		ThBSTreeNode<T>* right;
		
	public:
		ThBSTreeNode();
		ThBSTreeNode(const T& elem);
		ThBSTreeNode(const T& ele,ThBSTreeNode* l,int leftTag,ThBSTreeNode* r,int rightTag);
		T value() const;
		ThBSTreeNode<T>* leftchild() const;
		ThBSTreeNode<T>* rightchild() const;
		
		void setvalue(const T& val);
};

template <class T>
ThBSTreeNode<T>::ThBSTreeNode(const T& elem)
{
	element=elem;
	left=right=NULL;
	lTag=rTag=0;
}

template <class T>
ThBSTreeNode<T>::ThBSTreeNode(const T& ele,ThBSTreeNode<T>* l,int leftTag,ThBSTreeNode<T>* r,int rightTag)
{
	element=ele;
	left=l;
	lTag=leftTag;
	right=r;
	rTag=rightTag;
}

template <class T>
T ThBSTreeNode<T>::value() const
{
	return element;
}

template <class T>
ThBSTreeNode<T>* ThBSTreeNode<T>::leftchild() const
{
	return left;
}


template <class T>
ThBSTreeNode<T>* ThBSTreeNode<T>::rightchild() const
{
	return right;
}

template <class T>
void ThBSTreeNode<T>::setvalue(const T& val)
{
	element=val;
}


template <class T>
class ThBSTree
{
	protected:
		ThBSTreeNode<T>* root;
	public:
		ThBSTree(){root=NULL;};
		~ThBSTree(){DeleteThBSTree(root);};
		bool isempty() const
		{
			if(root==NULL)
				return true;
			else
				return false;
		};
		ThBSTreeNode<T>* getroot(){return root;};
		ThBSTreeNode<T>* getparent(ThBSTreeNode<T> *current);

		ThBSTreeNode<T>* findvalue(T elem);
		void AddNode(ThBSTreeNode<T>* p);
		void InsertNode(ThBSTreeNode<T>*p,ThBSTreeNode<T>*newpointer);
		void DeleteValue(T elem);
		void DeleteNode(ThBSTreeNode<T> *p);
		void CreatTree(const T& elem,ThBSTree<T> & lefttree,ThBSTree<T> & righttree);
		ThBSTreeNode<T>* Pre(ThBSTreeNode<T>*p);
		ThBSTreeNode<T>* Next(ThBSTreeNode<T>*p);

		void Inprint();
		void Preprint();

		void DeleteThBSTree(ThBSTreeNode<T>* root);
		
};

template <class T>
ThBSTreeNode<T>* ThBSTree<T>::findvalue(T elem)
{
	ThBSTreeNode<T> * pointer;
	if(root==NULL)
		return NULL;
	else
		pointer=root;
	while(pointer->left!=NULL)
		pointer=pointer->left;
	if(pointer->element>elem)
		return NULL;
	else if(pointer->element==elem)
		return pointer;
	while(Next(pointer)!=NULL&&Next(pointer)->element<elem)
		pointer=Next(pointer);
	pointer=Next(pointer);
	if(pointer==NULL)
		return NULL;
	else if(pointer->element==elem)
		return pointer;
	else 
		return NULL;
}

template <class T>
void ThBSTree<T>::DeleteValue(T elem)
{
	ThBSTreeNode<T>*p;
	while((p=findvalue(elem))!=NULL)
		DeleteNode(p);
}

template <class T>
void ThBSTree<T>::DeleteThBSTree(ThBSTreeNode<T> *root)
{
	if(root!=NULL)
	{
		if(root->lTag==0)
			DeleteThBSTree(root->left);
		if(root->rTag==0)
			DeleteThBSTree(root->right);
		delete root;
	}
}

template <class T>
ThBSTreeNode<T>* ThBSTree<T>::getparent(ThBSTreeNode<T>* current)
{
	ThBSTreeNode<T>* r=root;
	if(current==r)
		return NULL;
	while(1)
	{
		if(r->lTag==0&&r->left!=NULL)
		{
			if(r->left==current)
				return r;
		}
		if(r->rTag==0&&r->right!=NULL)
		{
			if(r->right==current)
				return r;
		}
		if(r->lTag==0&&r->element>current->element)
		{
			r=r->left;continue;
		}
		if(r->rTag==0&&r->element<current->element)
		{
			r=r->right;continue;
		}
	}
}

template <class T>
void ThBSTree<T>::AddNode(ThBSTreeNode<T>* p)
{
	ThBSTreeNode<T>* temp=root;
	if(root==NULL)
		root=p;
	else
	{
		if(p->element==temp->element)
		{
			InsertNode(temp,p);
		}
		else if(p->element>temp->element)
		{
			while(1)
			{
				ThBSTreeNode<T> * tempnext;
				if(temp->right==NULL)
					tempnext=NULL;
				else if(temp->rTag==1)
					tempnext=temp->right;
				else
				{
					tempnext=temp->right;
					while(tempnext->lTag==0)
						tempnext=tempnext->left;
				}
				if(tempnext==NULL||p->element<=tempnext->element)
				{
					InsertNode(temp,p);
					break;
				}
				temp=tempnext;
			}
		}
		else
		{
			while(1)
			{
				ThBSTreeNode<T> * tempbefore;
				if(temp->left==NULL)
					tempbefore=NULL;
				else if(temp->lTag==1)
					tempbefore=temp->left;
				else
				{
					tempbefore=temp->left;
					while(tempbefore->rTag==0)
						tempbefore=tempbefore->right;
				}
				if(tempbefore==NULL)
				{
					temp->left=p;
					temp->lTag=p->lTag=0;
					p->right=temp;
					p->rTag=1;
					break;
				}
				else if(p->element>=tempbefore->element)
				{
					InsertNode(tempbefore,p);
					break;
				}
				temp=tempbefore;
			}
		}
	}
}

template <class T>
void ThBSTree<T>::InsertNode(ThBSTreeNode<T> *p,ThBSTreeNode<T> *newpointer)
{
	ThBSTreeNode<T> *temppointer=NULL;
	if(p->right==NULL)
		temppointer=NULL;
	else if(p->rTag==1)
		temppointer=p->right;
	else
	{
		temppointer=p->right;
		while(temppointer->lTag==0)
			temppointer=temppointer->left;
	}
	if((temppointer!=NULL) && (temppointer->lTag==1))
		temppointer->left=newpointer;               
	newpointer->rTag=p->rTag;
	newpointer->right=p->rightchild();
	p->rTag=0;
	p->right=newpointer;
	newpointer->lTag=1;
	newpointer->left=p;
}

template <class T>
ThBSTreeNode<T>* ThBSTree<T>::Pre(ThBSTreeNode<T>*pointer)
{
	ThBSTreeNode<T>* temppointer=NULL;
	if(pointer->left==NULL)
		temppointer=NULL;
	else if(pointer->lTag==1)
		temppointer=pointer->left;
	else
	{
		temppointer=pointer->left;
		while(temppointer->rTag==0)
			temppointer=temppointer->right;
	}
	return temppointer;
}


template <class T>
ThBSTreeNode<T>* ThBSTree<T>::Next(ThBSTreeNode<T>*pointer)
{
	ThBSTreeNode<T>* temppointer=NULL;
	if(pointer->right==NULL)
		temppointer=NULL;
	else if(pointer->rTag==1)
		temppointer=pointer->right;
	else
	{
		temppointer=pointer->right;
		while(temppointer->lTag==0)
			temppointer=temppointer->left;
	}
	return temppointer;
}

template <class T>
void ThBSTree<T>::Inprint()
{
	ThBSTreeNode<T> * pointer;
	int i=0;
	if(root==NULL)
		return;
	else
		pointer=root;
	while(pointer->left!=NULL)
	{
		pointer=pointer->left;
		i++;
	}
	while(1)
	{
		for(int j=0;j<i;j++)
			cout<<"   ";
		cout<<pointer->element<<endl;
		if(pointer->right==NULL)
			return;
		if(pointer->rTag==1)
		{
			ThBSTreeNode<T> * temp=pointer->right;
			if(temp->lTag==1)
				i--;
			else
			{
				temp=temp->left;
				i--;
				while(temp->rTag==0)
				{
					temp=temp->right;
					i--;
				}
			}
			pointer=pointer->right;
		}
		else
		{
			pointer=pointer->right;
			i++;
			while(pointer->lTag==0)
			{
				pointer=pointer->left;
				i++;
			}
		}
	}
}

template <class T>
void ThBSTree<T>::Preprint()
{
	ThBSTreeNode<T> *p;
	int i=0;
	if(root==NULL)
		return;
	else
		p=root;
	ThBSTreeNode<T> * temp=p;
	while(p)
	{
		for(int j=0;j<i;j++)
			cout<<"   ";
		cout<<p->element<<endl;
		if(p->left!=NULL && p->lTag==0)
		{
			p=p->left;
			i++;
		}
		else
		{
			while(p->rTag==1)
			{
				temp=p->right;
				if(temp->lTag==1)
					i--;
				else
				{
					temp=temp->left;
					i--;
					while(temp->rTag==0)
					{
						temp=temp->right;
						i--;
					}
				}
				p=p->right;
			}
			p=p->right;
			i++;
		}
		
	}
}

template <class T>
void ThBSTree<T>::DeleteNode(ThBSTreeNode<T> *p)
{
	if(p==NULL)
		return;
	ThBSTreeNode<T> * temppointer,* temppointerpre,* temppointernext;
	ThBSTreeNode<T> * tempparent=NULL;
	ThBSTreeNode<T> * parent=getparent(p);
	if(p->left==NULL||p->lTag==1)//若欲刪結點的左子樹為空,就用它的右子樹代替它
	{
		if(parent==NULL)
		{
			root=p->right;
			temppointer=Next(p);
			if(temppointer!=NULL)
			{
				temppointer->left=NULL;
				temppointer->lTag=0;
			}
		}
		else if(parent->left==p)
		{
			if(p->rTag==0)
				parent->left=p->right;
			else
			{
				parent->left=NULL;
				parent->lTag=1;
			}
			temppointernext=Next(p);
			temppointerpre=Pre(p);
			if(temppointerpre!=NULL && temppointerpre->rTag==1)
			{
				temppointerpre->right=temppointernext;
				if(temppointernext==NULL)
					temppointerpre->rTag=0;
			}
			if(temppointernext!=NULL && temppointernext->lTag==1)
			{
				temppointernext->left=temppointerpre;
				if(temppointerpre==NULL)
					temppointernext->lTag=0;
			}
		}
		else
		{
			if(p->rTag==0)
				parent->right=p->right;
			else
			{
				parent->right=NULL;
				parent->rTag=1;
			}
			temppointernext=Next(p);
			temppointerpre=Pre(p);
			if(temppointerpre!=NULL && temppointerpre->rTag==1)
			{
				temppointerpre->right=temppointernext;
				if(temppointernext==NULL)
					temppointerpre->rTag=0;
			}
			if(temppointernext!=NULL && temppointernext->lTag==1)
			{
				temppointernext->left=temppointerpre;
				if(temppointerpre==NULL)
					temppointernext->lTag=0;
			}
		}
		delete p;
		p=NULL;
		return;
	}
	//當欲刪結點的左子樹不為空的情況,在左子樹尋找最大結點替換欲刪結點
	//注意可能有n個相等的最大結點,那么就把它們作為一個整體
	//samehead指向它們中的第一個,temppointer指向最后一個
	temppointer=p->left;
	ThBSTreeNode<T> * samehead=temppointer;
	while(temppointer->right!=NULL&&temppointer->rTag==0)
		temppointer=temppointer->right;
	while(samehead->element!=temppointer->element)
		samehead=samehead->right;
	tempparent=getparent(samehead);
	
	if(tempparent==p)
	{
		p->left=samehead->left;
		p->lTag=samehead->lTag;
	}
	else
	{
		if(samehead->lTag==0)
			tempparent->right=samehead->left;
		else
		{
			tempparent->rTag=1;
			tempparent->right=temppointer->right;
		}
	}
	if(parent==NULL)
		root=samehead;
	else if(parent->left=p)
		parent->left=samehead;
	else
		parent->right=samehead;
	
	temppointernext=Next(p);
	temppointerpre=Pre(samehead);
	if(temppointerpre!=NULL && temppointerpre->rTag==1)
	{
		temppointerpre->right=samehead;
		if(samehead==NULL)
			temppointerpre->rTag=0;
	}
	if(temppointernext!=NULL && temppointernext->lTag==1)
	{
		temppointernext->left=temppointer;
		if(temppointer==NULL)
			temppointernext->lTag=0;
	}
	samehead->left=p->left;
	samehead->lTag=p->lTag;
	temppointer->right=p->right;
	temppointer->rTag=p->rTag;
	delete p;
	p=NULL;
	return;
}

#define tree ThBSTree<int>

void MyInsertNode(tree & mytree);
void MyDeleteNode(tree & mytree);
void MyPreOrderPrint(tree & mytree);
void MyInOrderPrint(tree & mytree);

void main()
{
	tree mytree;
	char press;
	while(press!='q')
	{
		system("cls");
		cout<<"\t\tThreaded Binary Search Tree"<<endl;
		cout<<"\t----------------------------------------"<<endl;
		cout<<"\t\t\t(a)添加新結點"<<endl;
		cout<<"\t\t\t(b)刪除指定結點"<<endl;
		cout<<"\t\t\t(c)中序周游ThBST"<<endl;
		cout<<"\t\t\t(d)前序周游ThBST"<<endl;
		cout<<"\t\t\t(q)退出"<<endl;
		press=getch();
		switch(press)
		{
		case 'a':
			MyInsertNode(mytree);break;
		case 'b':
			MyDeleteNode(mytree);break;
		case 'c':
			MyInOrderPrint(mytree);break;
		case 'd':
			MyPreOrderPrint(mytree);break;
		case 'q':                   
			break;
		default:
			break;
		}
	}
}

void MyInsertNode(tree & mytree)
{
	system("cls");
	cout<<"\t\tThreaded Binary Search Tree"<<endl;
	cout<<"\t----------------------------------------"<<endl;
	cout<<"\t\t\t添加新結點"<<endl<<endl<<endl<<endl;
	cout<<"請輸入欲插入的結點值:";
	int value;
	cin>>value;
	mytree.AddNode(new ThBSTreeNode<int>(value));
}

void MyDeleteNode(tree & mytree)
{
	system("cls");
	cout<<"\t\tThreaded Binary Search Tree"<<endl;
	cout<<"\t----------------------------------------"<<endl;
	cout<<"\t\t\t刪除指定結點"<<endl<<endl<<endl<<endl;
	if(mytree.isempty())
	{
		cout<<"該樹為空樹,請先輸入結點再刪除"<<endl;
		cout<<"任意健繼續..."<<endl;
		getch();
	}
	else
	{
		int value;
		cout<<"請輸入欲刪除的結點值:";
		cin>>value;
		if(mytree.findvalue(value)==NULL)
		{
			cout<<"不存在該值的結點!"<<endl;
			cout<<"任意健繼續..."<<endl;
			getch();
		}
		else
		{
			mytree.DeleteValue(value);
			cout<<"刪除成功!"<<endl;
			cout<<"任意健繼續..."<<endl;
			getch();
		}
	}
}

void MyInOrderPrint(tree & mytree)
{
	system("cls");
	cout<<"\t\tThreaded Binary Search Tree"<<endl;
	cout<<"\t----------------------------------------"<<endl;
	cout<<"\t\t\t中序周游ThBST"<<endl<<endl<<endl<<endl;
	if(mytree.isempty())
	{
		cout<<"該樹為空樹,不能打印"<<endl;
		cout<<"任意健繼續..."<<endl;
		getch();
	}
	else
	{
		mytree.Inprint();
		cout<<"任意健繼續..."<<endl;
		getch();
	}
}

void MyPreOrderPrint(tree & mytree)
{
	system("cls");
	cout<<"\t\tThreaded Binary Search Tree"<<endl;
	cout<<"\t----------------------------------------"<<endl;
	cout<<"\t\t\t前序周游ThBST"<<endl<<endl<<endl<<endl;
	if(mytree.isempty())
	{
		cout<<"該樹為空樹,不能打印"<<endl;
		cout<<"任意健繼續..."<<endl;
		getch();
	}
	else
	{
		mytree.Preprint();
		cout<<"任意健繼續..."<<endl;
		getch();
	}
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产乱码一区二区三区| 精品一区二区免费在线观看| 国产亚洲精品精华液| 欧美电影精品一区二区| 欧美一级爆毛片| 欧美一级一区二区| 精品免费日韩av| 国产亚洲制服色| 欧美激情一区三区| 亚洲天堂久久久久久久| 欧美激情一区三区| 亚洲视频你懂的| 亚洲国产综合人成综合网站| 三级久久三级久久久| 秋霞成人午夜伦在线观看| 久久99久久久久| 成人免费观看视频| 91在线视频播放地址| 在线电影院国产精品| 欧美mv日韩mv国产网站| 国产精品你懂的| 亚洲国产你懂的| 国产伦精品一区二区三区免费| 国产成a人亚洲精品| 91福利在线免费观看| 精品国产欧美一区二区| 中文字幕精品综合| 亚洲午夜电影在线观看| 久久99精品久久久久婷婷| 成人avav影音| 欧美一区日本一区韩国一区| 国产精品午夜电影| 五月天中文字幕一区二区| 国产精品888| 欧美三级日本三级少妇99| 久久午夜国产精品| 亚洲一区在线视频| 国产精品夜夜嗨| 欧美日韩美女一区二区| 欧美国产日韩在线观看| 日韩中文欧美在线| 不卡的电影网站| 精品国产一二三区| 亚洲一区二区三区国产| 国产在线视视频有精品| 欧美性受xxxx黑人xyx性爽| 久久精品亚洲精品国产欧美 | 91在线视频播放| 日韩精品最新网址| 亚洲激情av在线| 国产乱码精品一品二品| 91精品国产91综合久久蜜臀| 亚洲精品国产精华液| 国产精品18久久久久久久网站| 欧美日韩精品一区二区三区四区| 国产精品乱人伦| 国产美女视频一区| 精品国产一区二区三区久久久蜜月| 亚洲午夜影视影院在线观看| av激情亚洲男人天堂| 国产午夜精品理论片a级大结局 | 欧美日韩成人高清| 国产精品二三区| 成人一区二区三区在线观看| 日韩欧美电影在线| 免费高清在线一区| 欧美精品在线一区二区| 依依成人精品视频| 日本韩国精品一区二区在线观看| 欧美韩国日本不卡| 国产成人精品免费网站| 久久久亚洲精品一区二区三区| 蜜臀久久99精品久久久久宅男 | 亚洲高清免费视频| 欧美性一二三区| 亚洲h精品动漫在线观看| 在线视频国内一区二区| 亚洲与欧洲av电影| 欧美午夜不卡在线观看免费| 亚洲一二三四区| 91超碰这里只有精品国产| 亚洲一二三四久久| 7777精品伊人久久久大香线蕉| 天天亚洲美女在线视频| 欧美xfplay| 国产成人精品网址| 亚洲视频一区在线观看| 色偷偷久久人人79超碰人人澡| 亚洲精品国产第一综合99久久 | 91精品婷婷国产综合久久竹菊| 日本伊人色综合网| 26uuu欧美日本| 成人久久18免费网站麻豆 | 欧美日韩免费观看一区二区三区| 亚洲夂夂婷婷色拍ww47| 91精品国产一区二区三区蜜臀 | 精品久久国产老人久久综合| 国产在线观看免费一区| 亚洲欧洲av在线| 欧美日韩精品三区| 韩国成人福利片在线播放| 国产精品人成在线观看免费| 在线看一区二区| 蜜桃视频一区二区三区在线观看| 国产亚洲一二三区| 91黄色激情网站| 激情文学综合网| 亚洲美女偷拍久久| 日韩网站在线看片你懂的| 不卡一卡二卡三乱码免费网站| 亚洲一区二区av在线| 国产欧美综合在线观看第十页| 在线影视一区二区三区| 久久99国产精品久久99果冻传媒| 亚洲欧洲韩国日本视频| 欧美xxxx老人做受| 欧美色男人天堂| 成人小视频免费观看| 日韩电影在线一区二区| 中文字幕一区日韩精品欧美| 欧美一个色资源| 在线观看免费亚洲| 国产福利91精品一区| 麻豆精品国产传媒mv男同| 亚洲欧美日韩电影| 国产色爱av资源综合区| 欧美一级黄色大片| 91久久国产最好的精华液| 粉嫩av一区二区三区粉嫩| 免费在线观看视频一区| 一区二区三区久久久| 日韩美女啊v在线免费观看| 久久综合999| 日韩欧美在线123| 欧美日本在线看| 91福利在线导航| 色一情一伦一子一伦一区| 风间由美一区二区三区在线观看| 久久91精品久久久久久秒播| 日韩精品电影一区亚洲| 性久久久久久久久久久久| 亚洲午夜av在线| 亚洲尤物视频在线| 亚洲一区二区三区四区在线观看| ●精品国产综合乱码久久久久| 国产日韩欧美不卡| 久久精品欧美日韩精品| 久久亚洲欧美国产精品乐播 | 欧美日韩的一区二区| 色噜噜狠狠成人网p站| 一本一本久久a久久精品综合麻豆 一本一道波多野结衣一区二区 | 国产欧美日韩卡一| 国产亚洲一区二区在线观看| 久久精品欧美一区二区三区不卡 | 亚洲人xxxx| 亚洲人成亚洲人成在线观看图片| 中文字幕中文在线不卡住| 国产精品久久影院| 亚洲精品乱码久久久久久黑人 | 99在线精品观看| 91色视频在线| 欧美日韩国产片| 欧美一区二区三区白人| 精品国产精品一区二区夜夜嗨| 精品蜜桃在线看| 国产女同互慰高潮91漫画| 国产精品久久一卡二卡| 亚洲综合一区二区| 日韩激情视频在线观看| 寂寞少妇一区二区三区| 成人在线综合网站| 97久久精品人人爽人人爽蜜臀| 欧美最新大片在线看 | 欧美韩日一区二区三区四区| 亚洲视频狠狠干| 午夜视频一区二区三区| 久久精品99国产国产精| 成人看片黄a免费看在线| 欧美午夜片在线观看| 日韩免费视频一区二区| 国产精品久久久久一区| 天天色综合天天| 国产成人在线看| 欧美日韩亚洲另类| 国产拍揄自揄精品视频麻豆| 亚洲午夜激情av| 高清国产一区二区| 91麻豆精品国产91久久久| 国产精品私人自拍| 午夜久久久久久久久久一区二区| 国产米奇在线777精品观看| 欧美三区在线观看| 国产日韩av一区二区| 亚洲观看高清完整版在线观看| 国产一区二区三区美女| 欧美三级日韩三级国产三级| 中文字幕精品三区| 麻豆91小视频| 欧美性生活一区| 国产精品福利影院|