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

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

?? tree.h

?? 本程序是實現二叉樹跟樹的常用算法
?? H
字號:

template<typename T>class Tree;

/*定義樹結點類*/
template<typename T>class TreeNode
{
public:

	TreeNode(T value);
    virtual~TreeNode(){};
    T value();
    friend class Tree<T>;

private:

	T m_Value;
    TreeNode<T> * pChild;
    TreeNode<T> *pSibling;

};

template<typename T>TreeNode<T>::TreeNode(T value)
{
	m_Value = value;
    pChild = NULL;
    pSibling = NULL;
}

/*定義樹類,用動態左孩子/右孩子表示法來建立樹*/
template<typename T>class Tree
{
public:
	
	Tree(){ root=current=NULL; }
	~Tree(){ MakeEmpty(root);}
	int Root();
	int FirstChild();
	int NextSibling();
	void InsertChild(T value);
	void DeleteSubTree(TreeNode<T> *&t);
	void DisplayTree();
	void MakeEmpty(TreeNode<T> *&t);

private:
    
	TreeNode<T> *root, *current;           //定義根結點根當前指針

	TreeNode<T> * GetParent(TreeNode<T> *t,TreeNode<T> *c);
    TreeNode<T> * PrevSibling1(TreeNode<T> *t,TreeNode <T> *current);
	TreeNode<T> * PrevSibling2(TreeNode<T> *t,TreeNode <T> *current);
    int  Current(TreeNode<T> *&t);
	void RootFistTraverse(TreeNode<T> *t);
    void RootLastTraverse(TreeNode<T> *t);
    void WidthTraverse(TreeNode<T> *t);
	void PrintVTree(TreeNode<T> *t);

};

/*清空已t為跟結點的樹*/
template<typename T>void Tree<T>::MakeEmpty(TreeNode<T> *&t)
{
	if(t!=NULL)
	{
		MakeEmpty(t->pChild);
		MakeEmpty(t->pSibling);
		delete t;
	}
}

/*確定當前結點*/
template<typename T>int Tree<T>::Current(TreeNode<T> *&t)
{
	if(t == NULL)
	{
		current = NULL;
		return 0;
	}

	else
	{
		current = t;
		return 1;
	}
}

/*定位根結點*/
template<typename T>int Tree<T>::Root()  
{
	if(root == NULL)
	{   
		current = NULL;
		return 0;
	}

	return Current(root);
}

/*查找父母結點*/
template<typename T>TreeNode<T>* Tree<T>::GetParent(TreeNode<T> *t,TreeNode<T> *c) 
{
	if(t == NULL || t->pChild == NULL && t->pSibling == NULL)
		return NULL;

	if(t->pChild == c || t->pSibling == c)
		return root;
    
	TreeNode<T> *p;

	p = GetParent(t->pChild, c);  
	if(p != NULL)
		return p;
	p = GetParent(t->pSibling, c);
	if(p != NULL)
		return p;
}

/*定位于最左孩子*/
template<typename T>int Tree<T>::FirstChild()
{
	if(current == NULL || current->pChild == NULL)
		return 0;
	
	else
	{
		current = current->pChild;
		return Current(current);
	}
}

/*定位于右兄弟*/
template<typename T>int Tree<T>::NextSibling()
{
	if(current == NULL || current->pSibling == NULL)
		return 0;

	else
	{
		current = current->pSibling;
		return Current(current);
	}
}

template<typename T>void Tree<T>::InsertChild(T value)
{
   TreeNode<T> *newNode;

   newNode = new TreeNode<T>(value);
   if(root == NULL)
	   root = current = newNode;
   
   else{
	   if(current->pChild == NULL)
		   current->pChild = newNode;
	   
	   else{
		   TreeNode<T> *p;
		   p = current->pChild;
		   while(p->pSibling != NULL)
			   p = p->pSibling;
		   p->pSibling = newNode;
	   }
   }
   Current(newNode);
}

/*遍歷的時候雖然是遍歷轉換后二叉樹,但是結果仍然是樹的遍歷*/
template<typename T>void Tree<T>::RootFistTraverse(TreeNode<T> *t)
{
	stack<TreeNode<T>*> s;
	TreeNode<T> *p = t;
	s.Push(NULL);
	
	while(p != NULL)
	{
		cout<<p->m_Value<<'\t';
	    
		if(p->pSibling != NULL)
			s.Push(p);
		
		if(p->pChild != NULL)
			p = p->pChild;	
		else
		{	
		 p = s.Pop();
		 if(p != NULL)
		 p = p->pSibling;
		}
	}
}

/*遍歷的時候雖然是遍歷轉換后二叉樹,但是結果仍然是樹的遍歷,
不要看成是二叉樹的中序遍歷*/
template<typename T>void Tree<T>::RootLastTraverse(TreeNode<T> *t)
{
    stack<TreeNode<T>*> s;
	TreeNode<T> *p = t;
	
	while(p!=NULL || !s.IsEmpty())
	{
		while(p!=NULL)
		{
			s.Push(p);
			p=p->pChild;
		}

		p = s.Pop();
		cout<<p->m_Value<<'\t';
		p = p->pSibling;
	}
}

/*層次遍歷樹*/
template<typename T>void Tree<T>::WidthTraverse(TreeNode<T> *t)
{
	queue<TreeNode<T> *> Q;
    TreeNode<T> *p = root;
	
	if(p != NULL)
	{
		Q.EnQue(p);
		while(!Q.IsEmpty())	
		{   
			p=Q.DeQue();
			cout<<p->m_Value<<'\t';
			while(p->pSibling != NULL)
			{
				if(p->pChild!=NULL)
					Q.EnQue(p->pChild);
			    p = p->pSibling;
				cout<<p->m_Value<<'\t';
		    }		    
			if(p->pChild != NULL)
				Q.EnQue(p->pChild);
		}
		
	}
}

/*查找當前結點前一個鄰居結點的第一種方法*/
template<typename T>TreeNode<T> * Tree<T>::PrevSibling1(TreeNode<T> *t,TreeNode<T> *current)
{
	queue<TreeNode<T> *> Q;
    TreeNode<T> *p = root,*prev = NULL;
	
    if((t == NULL) || (current == p) || (current == NULL)) //當前結點是根結點或者是最左孩子時,沒有鄰居結點
		return NULL;

	if(p != NULL)
	{
		Q.EnQue(p);
		while(!Q.IsEmpty())	
		{   
            prev=NULL;
			p=Q.DeQue();
			while(p->pSibling != NULL)
			{
				if(p->pChild!=NULL)
					Q.EnQue(p->pChild);
			    prev = p;
				p = p->pSibling;
				if(p == current)
					return prev;
		    }		    
			if(p->pChild != NULL)
				Q.EnQue(p->pChild);
		}	
	}
}

/*查找當前結點前一個鄰居結點的第二種方法*/
template<typename T>TreeNode<T>* Tree<T>::PrevSibling2(TreeNode<T> *t,TreeNode <T> *current)
{
	TreeNode<T> *p = root, *Prev = NULL ;
	queue<TreeNode<T> *> Q;

	if((t == NULL) || (current == p) || (current == NULL))
		return NULL;

	while(p != NULL)
	{
		if(p == current)
           return Prev;
		Q.EnQue(p);
		Prev = p;
		p = p->pSibling;
	}

	while(!Q.IsEmpty())
	{
		Prev = NULL;
		p = Q.DeQue();
		p = p->pChild;
		while(p != NULL)
		{
			if(p == current)
				return Prev;
			Q.EnQue(p);
			Prev = p;
			p = p->pSibling;
		}//end while
	}//end while
}

/*刪除以current為根結點的子樹*/
template<typename T>void Tree<T>::DeleteSubTree(TreeNode<T> *&t)
{
	TreeNode<T> *p = PrevSibling1(root,t);
	
	if(p == NULL)
	{
		p = GetParent(root,t);
			if(p!=NULL)
			{
				p->pChild = t->pSibling;
				t->pSibling = NULL;
			}
			else
			{
				root= t->pChild;
				t->pChild = NULL;
			}
	}
	else{
		p->pSibling = t->pSibling;
		t->pSibling = NULL;
	}
	MakeEmpty(t);
}

/*用圖形顯示樹*/
template<typename T>void Tree<T>::PrintVTree(TreeNode<T> *t){
	
	int screenWidth=64;
	int dataWidth=2;
	
	queue<TreeNode<T> *> Q;
	queue<Level> QI;
	
	TreeNode<T> *p;
	Level s,s1,s2;
	
	double offset,level=-1,i;
	Q.EnQue(t);
	s.xIndent=screenWidth/dataWidth;
	s.yLevel=0;
	QI.EnQue(s);
	
	while(!Q.IsEmpty()&&!QI.IsEmpty())
	{
		s2=s;
		p=Q.DeQue();
		s=QI.DeQue();
		
		if(s.yLevel!=level)
		{
		    cout<<"\n\n第"<<s.yLevel<<"層";
			level=s.yLevel;
			for(i=0;i<s.xIndent-1;i++) cout<<" ";
		}
		else	
			for(i=0;i<s.xIndent-s2.xIndent;i++) cout<<" ";
		       cout<<p->m_Value;
		
		if(p->pChild!=NULL)
		{
			Q.EnQue(p->pChild);
			s1.yLevel=s.yLevel+1;
			offset=screenWidth/pow(dataWidth,s1.yLevel+1);
			s1.xIndent=s.xIndent-offset;
			QI.EnQue(s1);
		}
		
		if(p->pSibling!=NULL)
		 { 
		 
			 Q.EnQue(p->pSibling);
			 s1.yLevel=s.yLevel+1;
			 offset=screenWidth/pow(dataWidth,s1.yLevel+1);
			 s1.xIndent=s.xIndent+offset;
			 QI.EnQue(s1);
		}
	}
}

template<typename T>void Tree<T>::DisplayTree()
{
	cout<<"打印樹:"<<endl;
	PrintVTree(root);
	cout<<endl<<endl;
	
	cout<<"按先根遍歷樹顯示的結點次序為:"<<endl<<endl;
	RootFistTraverse(root);
	cout<<endl<<endl;

	cout<<"按后根遍歷樹顯示的結點次序為:"<<endl<<endl;
	RootLastTraverse(root);
	cout<<endl;

    cout<<"按層次遍歷樹顯示的結點次序為:"<<endl<<endl;
	WidthTraverse(root);
	cout<<endl;

	Root();
	FirstChild();
	NextSibling();
    NextSibling();
	cout<<"顯示當前結點的前一個鄰居結點:"<<endl<<endl;
	cout<<"當前結點是:"<<current->m_Value<<endl<<endl;
	TreeNode<T> *p;
	p = PrevSibling1(root,current);
	cout<<"前一個鄰居結點是:"<<endl;
	cout<<p->m_Value<<endl;

	cout<<"刪除當前結點為根結點的子樹:"<<endl<<endl;
	Root();
	FirstChild();
	NextSibling();
	cout<<"要刪除以這個結點為根的子樹的結點是:"<<endl;
	cout<<current->m_Value<<endl;
	DeleteSubTree(current);
	PrintVTree(root);
	cout<<endl<<endl;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲欧美日韩国产综合在线| 精品久久一区二区| 久久精品国产亚洲高清剧情介绍 | 91丝袜高跟美女视频| 九九九久久久精品| 久久99国产精品久久99| 日韩不卡一二三区| 日韩av一区二| 日韩中文字幕亚洲一区二区va在线| 亚洲欧美日韩一区二区三区在线观看| 国产精品久久久久四虎| 国产精品嫩草影院av蜜臀| 国产欧美一区二区精品久导航 | 一区二区三国产精华液| 日韩美女啊v在线免费观看| 中文字幕免费在线观看视频一区| 久久久九九九九| 中文字幕的久久| **性色生活片久久毛片| 国产精品久久毛片av大全日韩| 亚洲欧美另类图片小说| 亚洲一区二区三区国产| 日韩电影一区二区三区四区| 蜜桃一区二区三区在线观看| 国产美女在线观看一区| 国产成人综合视频| 91在线视频播放| 欧美性生活影院| 精品少妇一区二区三区免费观看 | 亚洲人精品午夜| 亚洲一区二区三区精品在线| 裸体健美xxxx欧美裸体表演| 国产乱码一区二区三区| 色欧美片视频在线观看在线视频| 日韩一区二区三区视频在线| 国产视频亚洲色图| 一区二区三区四区视频精品免费 | 一本一道综合狠狠老| 欧美日韩色综合| 26uuu精品一区二区在线观看| 国产精品久久久久毛片软件| 亚洲 欧美综合在线网络| 精品中文字幕一区二区小辣椒| 99久久伊人精品| 日韩亚洲欧美在线| 中文字幕中文字幕一区| 日韩黄色在线观看| 懂色av一区二区三区免费观看| 欧美美女激情18p| 中文字幕欧美日本乱码一线二线| 午夜精品久久久久久久99水蜜桃| 国产成人丝袜美腿| 欧美喷水一区二区| 亚洲天堂av一区| 国产一区二区在线看| 欧美网站大全在线观看| 国产亚洲欧美日韩日本| 美国三级日本三级久久99| 91网上在线视频| 久久久国产精品午夜一区ai换脸| 亚洲成人综合网站| av激情亚洲男人天堂| 久久久久国色av免费看影院| 日韩高清一区在线| 日本精品一区二区三区高清| 日本一区二区不卡视频| 久久99国产精品尤物| 91精品国产综合久久久蜜臀图片| 亚洲欧美另类图片小说| 不卡电影一区二区三区| 国产香蕉久久精品综合网| 久久精品国产秦先生| 欧美精品在线视频| 亚洲第一综合色| 欧美午夜精品免费| 亚洲欧美另类小说| 99久精品国产| 亚洲欧美日韩国产另类专区| 色综合网站在线| 亚洲视频一区在线| 99视频超级精品| 国产精品国产馆在线真实露脸 | 色吧成人激情小说| 国产精品私人自拍| 国产91精品一区二区麻豆亚洲| 久久精品夜夜夜夜久久| 国产成人精品免费| 国产日产欧产精品推荐色 | 国产精品素人视频| 成人深夜福利app| 中文字幕一区二区三区不卡在线| 不卡av电影在线播放| 国产精品久久久久久久第一福利| 99久久免费国产| 亚洲精品日日夜夜| 欧美日韩中文另类| 视频一区视频二区中文字幕| 91.com视频| 国内精品写真在线观看| 日本一区二区高清| 色综合久久中文字幕| 日韩激情中文字幕| 久久精品一区二区三区不卡| 成人av免费在线| 亚洲午夜激情网页| 欧美电影免费观看高清完整版| 国产露脸91国语对白| 国产精品第一页第二页第三页| 欧美视频一区在线观看| 午夜久久久久久| 久久九九久久九九| 91色.com| 久久se精品一区精品二区| 亚洲国产成人在线| 欧美日韩国产美| 国产激情一区二区三区四区| 一区二区不卡在线视频 午夜欧美不卡在| 在线播放/欧美激情| 国产精品一级在线| 亚洲一区二区在线免费观看视频| 欧美成人伊人久久综合网| caoporn国产精品| 免费观看在线综合色| 亚洲国产精品av| 欧美一区二区成人| 粉嫩嫩av羞羞动漫久久久| 日韩精品一级中文字幕精品视频免费观看 | 国产精品综合在线视频| 亚洲免费看黄网站| 久久婷婷色综合| 欧美日韩国产综合久久| 成人精品高清在线| 精品亚洲aⅴ乱码一区二区三区| 亚洲欧美日韩国产综合在线| 久久九九久久九九| 欧美二区乱c少妇| 在线观看一区二区视频| 国产成人激情av| 久久 天天综合| 日本视频在线一区| 一区二区三区成人| 亚洲天堂免费看| 亚洲国产精品成人综合色在线婷婷| 日韩欧美国产午夜精品| 欧美欧美欧美欧美| 欧美系列日韩一区| 99re8在线精品视频免费播放| 国产麻豆一精品一av一免费| 久久国产麻豆精品| 石原莉奈一区二区三区在线观看| 一区二区三区鲁丝不卡| 国产精品毛片久久久久久| 久久久久久久久99精品| 精品成人佐山爱一区二区| 欧美一区二区二区| 欧美一区国产二区| 日韩三级.com| 欧美一级生活片| 精品国产凹凸成av人导航| 日韩欧美一区电影| 欧美videossexotv100| 日韩三级伦理片妻子的秘密按摩| 日韩久久久久久| 欧美岛国在线观看| 精品国产制服丝袜高跟| 久久嫩草精品久久久精品一| 国产女人水真多18毛片18精品视频| 26uuu亚洲| 久久精品视频网| |精品福利一区二区三区| 亚洲视频小说图片| 亚洲一二三四区不卡| 午夜伦欧美伦电影理论片| 视频在线在亚洲| 奇米影视在线99精品| 精品一区二区免费| 国产成人在线观看免费网站| 97se狠狠狠综合亚洲狠狠| 色视频欧美一区二区三区| 欧美日韩精品一区二区| 欧美zozozo| 亚洲国产精华液网站w| 亚洲综合偷拍欧美一区色| 热久久一区二区| 成人免费毛片aaaaa**| 在线观看www91| 精品国产三级电影在线观看| 国产精品热久久久久夜色精品三区| 一区二区三区四区精品在线视频| 午夜精品视频一区| 国产一区二区在线看| 日本道免费精品一区二区三区| 51精品久久久久久久蜜臀| 国产日韩欧美高清在线| 亚洲欧美激情一区二区| 久久疯狂做爰流白浆xx| 99精品国产一区二区三区不卡| 91精品国产综合久久久久久| 国产精品麻豆一区二区| 五月综合激情日本mⅴ|