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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? tree.h

?? 數(shù)據(jù)結(jié)構(gòu)--樹的常見操作及維護(hù)算法的實現(xiàn)
?? H
字號:
// Tree.h: interface for the Tree class.
//
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_TREE_H__703FFCCE_C340_4198_98E7_00F503CF8261__INCLUDED_)
#define AFX_TREE_H__703FFCCE_C340_4198_98E7_00F503CF8261__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#include "TreeNode.h"
#include "DualTagTreeNode.h"
#include "LeftLinkTreeNode.h"
#include <queue>
#include <stack>

template <class T>
class Tree  
{
private:
	TreeNode<T>* root;								//樹根結(jié)點
													//返回current父節(jié)點,由Parent調(diào)用
	TreeNode<T>* getParent(TreeNode<T>* root,TreeNode<T>* current);
	void DestroyNodes(TreeNode<T>*root);			//刪除root為根的子樹

public:
	Tree();											//構(gòu)造函數(shù)
	Tree(DualTagTreeNode<T>* nodeArray,int count);	//構(gòu)造函數(shù),利用雙標(biāo)記位先根次序構(gòu)造樹
	Tree(LeftLinkTreeNode<T>* nodeArray,int count);	//構(gòu)造函數(shù),利用左鏈層次順序構(gòu)造樹

	virtual ~Tree();								//析構(gòu)函數(shù)
	TreeNode<T>* getRoot();							//返回樹中的根結(jié)點
	void CreateRoot(const T& rootValue);			//創(chuàng)建樹的根結(jié)點,使根結(jié)點元素的值為rootValue
	bool isEmpty();									//判斷是否為空樹,若是則返回true
	TreeNode<T>* Parent(TreeNode<T>* current);	    //返回current父節(jié)點
	TreeNode<T>* PrevSibling(TreeNode<T>* current); //返回current的前一個鄰居結(jié)點
	TreeNode<T>* PrevSibling2(TreeNode<T>* current); //返回current的前一個鄰居結(jié)點
	void DeleteSubTree(TreeNode<T>* subroot);		//釋放以root為根的子樹的所有結(jié)點
	void RootFirstTraverse(TreeNode<T>* root);		//先根深度優(yōu)先周游樹
	void RootLastTraverse(TreeNode<T>* root);		//后根深度優(yōu)先周游樹
	void WidthTraverse(TreeNode<T>* root);			//寬度優(yōu)先周游樹
	void WidthTraverse2(TreeNode<T>* root);			//寬度優(yōu)先周游樹:版本2
};

template <class T>
Tree<T>::Tree()
{//構(gòu)造函數(shù)
	root=NULL;
}

template <class T>
Tree<T>::Tree(DualTagTreeNode<T>* nodeArray,int count)
{
	//使用STL中的stack
	using std::stack;
	stack<TreeNode<T>* > aStack;
	//準(zhǔn)備建立根結(jié)點
	TreeNode<T>* pointer=new TreeNode<T>;
	root=pointer;
	//處理一個結(jié)點
	for(int i=0;i<count-1;i++)
	{
		pointer->setValue(nodeArray[i].info);
		if(nodeArray[i].rtag==0)
			aStack.push(pointer);
		else
			pointer->setSibling(NULL);

		TreeNode<T>* temppointer=new TreeNode<T>;
		if(nodeArray[i].ltag==0)
			pointer->setChild(temppointer);
		else
		{
			pointer->setChild(NULL);
			pointer=aStack.top();
  			aStack.pop();		
			pointer->setSibling(temppointer);
		}
		pointer=temppointer;
	}
	//處理最后一個結(jié)點
	pointer->setValue(nodeArray[count-1].info);
	pointer->setChild(NULL);
	pointer->setSibling(NULL);
}

template <class T>
Tree<T>::Tree(LeftLinkTreeNode<T>* nodeArray,int count)
{//構(gòu)造函數(shù),利用左鏈層次順序構(gòu)造樹
	using std::queue;							//使用STL隊列
	queue<TreeNode<T>*> aQueue;

	//準(zhǔn)備建立根結(jié)點
	TreeNode<T>* pointer=new TreeNode<T>;
	root=pointer;

	int currentIndex=-1;

	while(pointer||!aQueue.empty())
	{
		if(pointer)
		{
			currentIndex++;
			pointer->setValue(nodeArray[currentIndex].info);
			if(nodeArray[currentIndex].llink)
			{
				TreeNode<T>* leftpointer=new TreeNode<T>;				
				pointer->setChild(leftpointer);
				aQueue.push(leftpointer);
			} 
			else pointer->setChild(NULL);

			if(nodeArray[currentIndex].rtag==0)
			{
				TreeNode<T>* rightpointer=new TreeNode<T>;				
				pointer->setSibling(rightpointer);
			}
			else pointer->setSibling(NULL);

			pointer=pointer->RightSibling();//訪問pointer的兄弟
		}
		else
		{
			pointer=aQueue.front();
			aQueue.pop();
		}
	}
}

template <class T>
Tree<T>::~Tree()
{//析構(gòu)函數(shù)
	while(root)
		DeleteSubTree(root);
}

template <class T>
TreeNode<T>* Tree<T>::getRoot()
{//返回樹中的根結(jié)點
		return root;
}

template <class T>
void Tree<T>::CreateRoot(const T& rootValue)
{//創(chuàng)建樹的根結(jié)點,使根結(jié)點元素的值為rootValue
	if(!root)
		root=new TreeNode<T>(rootValue);
}

template <class T>
bool Tree<T>::isEmpty()
{//判斷是否為空樹,若是則返回true
	if(root)
		return false;
	return true;
}

template <class T>
void Tree<T>::RootFirstTraverse(TreeNode<T>* root)
{//先根深度優(yōu)先周游樹
	while(NULL!=root)
	{
		AfxMessageBox(root->Value());				//訪問當(dāng)前結(jié)點
		RootFirstTraverse(root->LeftMostChild());	//訪問頭一棵樹樹根的子樹
		root=root->RightSibling();					//周游其他的樹
	}
}

template <class T>
void Tree<T>::RootLastTraverse(TreeNode<T>* root)
{//后根深度優(yōu)先周游樹
	while(NULL!=root)
	{
		RootLastTraverse(root->LeftMostChild());	//訪問頭一棵樹樹根的子樹
		AfxMessageBox(root->Value());				//訪問當(dāng)前結(jié)點
		root=root->RightSibling();					//周游其他的樹
	}
}

template <class T>
void Tree<T>::WidthTraverse(TreeNode<T>* root)
{
	using std::queue;							//使用STL隊列
	queue<TreeNode<T>*> aQueue;
	TreeNode<T>* pointer=root;
	if(pointer)
	{
		aQueue.push(pointer);
		while(!aQueue.empty())
		{
			pointer=aQueue.front();
			AfxMessageBox(pointer->Value());
			while(pointer->RightSibling())
			{
				if(pointer->LeftMostChild())
					aQueue.push(pointer->LeftMostChild());
				pointer=pointer->RightSibling();
				AfxMessageBox(pointer->Value());
			}
			if(pointer->LeftMostChild())
				aQueue.push(pointer->LeftMostChild());
			aQueue.pop();
		}
	}
}

template <class T>
void Tree<T>::WidthTraverse2(TreeNode<T>* root)
{//寬度優(yōu)先周游樹:版本2
	using std::queue;							//使用STL隊列
	queue<TreeNode<T>*> aQueue;
	TreeNode<T>* pointer=root;
	if(pointer)
	{
		while(NULL!=pointer)
		{
			aQueue.push(pointer);
			pointer=pointer->RightSibling();
		}
		while(!aQueue.empty())
		{
			pointer=aQueue.front();
			aQueue.pop();
			AfxMessageBox(pointer->Value());
			pointer=pointer->LeftMostChild();
			while(pointer)
			{
				aQueue.push(pointer);
				pointer=pointer->RightSibling();
			}
		}
	}
}

template <class T>
TreeNode<T>* Tree<T>::PrevSibling(TreeNode<T>* current)
{//返回current的前一個鄰居結(jié)點
	using std::queue;								//使用ATL的隊列
	queue<TreeNode<T>*> aQueue;
	TreeNode<T>* pointer=root;
	TreeNode<T>* prev=NULL;

	if(pointer)
	{
		aQueue.push(pointer);
		while(!aQueue.empty())
		{
			pointer=aQueue.front();				 	//取隊列首結(jié)點
			if(pointer==current)
				return prev;
			while(pointer->RightSibling())
			{
				prev=pointer;
				pointer=pointer->pSibling;
				if(pointer==current)
					return prev;
				else 
				{
					if(prev->LeftMostChild())
						aQueue.push(prev->LeftMostChild());
				}
			}
			if(pointer->LeftMostChild())
				aQueue.push(pointer->LeftMostChild());
			aQueue.pop();
			prev=NULL;
		}
			
	}
	return NULL;
}

template <class T>
TreeNode<T>* Tree<T>::PrevSibling2(TreeNode<T>* current)
{//返回current的前一個鄰居結(jié)點
	using std::queue;								//使用ATL的隊列
	queue<TreeNode<T>*> aQueue;
	TreeNode<T>* pointer=root;
	TreeNode<T>* prev=NULL;
	if((NULL==current)||(NULL==pointer)||(current==pointer))
		return NULL;
	while(pointer)
	{
		if(pointer==current)
			return prev;
		aQueue.push(pointer);
		prev=pointer;
		pointer=pointer->pSibling;
	}
	while(!aQueue.empty())
	{
		prev=NULL;
		pointer=aQueue.front();				 	//取隊列首結(jié)點
		aQueue.pop();
		pointer=pointer->LeftMostChild();
		while(pointer)
		{
			if(pointer==current)
				return prev;
			aQueue.push(pointer);
			prev=pointer;
			pointer=pointer->pSibling;
		}
	}
	return NULL;
}

template <class T>
TreeNode<T>* Tree<T>::getParent(TreeNode<T>* root,TreeNode<T>* current)
{//返回current父節(jié)點,由Parent調(diào)用
	TreeNode<T>* temp;
	if(root==NULL)
		return NULL;
	//找到父結(jié)點
	if(root->LeftMostChild()==current)
		return root;
	//遞歸尋找父結(jié)點
	if((temp=getParent(root->LeftMostChild(),current))!=NULL)
		return temp;
	else return getParent(root->RightSibling(),current);	

}

template <class T>
TreeNode<T>* Tree<T>::Parent(TreeNode<T>* current)
{//返回current父節(jié)點
	TreeNode<T>* pointer=current;
	if(NULL!=pointer)
	{
		TreeNode<T>* leftmostChild=NULL;
		while((leftmostChild=PrevSibling(pointer))!=NULL)
			pointer=leftmostChild;
		leftmostChild=pointer;
		pointer=root;
		if(leftmostChild==root)
			return NULL;
		else return getParent(pointer,leftmostChild);
	}
}

template <class T>
void Tree<T>::DestroyNodes(TreeNode<T>* root)
{//刪除root為根的子樹的結(jié)點
	if(root)
	{
		DestroyNodes(root->LeftMostChild());		//遞歸刪除root的以左子結(jié)點為根的子樹
		DestroyNodes(root->RightSibling());		    //遞歸刪除root的以右兄弟結(jié)點為根的子樹
		delete root;								//刪除根結(jié)點
	}

}

template <class T>
void Tree<T>::DeleteSubTree(TreeNode<T>* subroot)
{//釋放以subroot為根的子樹的所有結(jié)點
	TreeNode<T>* pointer=PrevSibling(subroot);
	if(NULL==pointer)
	{
		pointer=Parent(subroot);
		if(pointer)
		{
			pointer->pChild=subroot->RightSibling();
			subroot->pSibling=NULL;
		}
		else
		{
			root=subroot->RightSibling();
			subroot->pSibling=NULL;
			
		}
	}
	else
	{
		pointer->pSibling=subroot->RightSibling();
		subroot->pSibling=NULL;
	}
	DestroyNodes(subroot);
}

#endif // !defined(AFX_TREE_H__703FFCCE_C340_4198_98E7_00F503CF8261__INCLUDED_)

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美成人一区二区三区| 美女精品一区二区| 91在线视频官网| 最新欧美精品一区二区三区| 成人激情小说乱人伦| 国产精品天干天干在观线| zzijzzij亚洲日本少妇熟睡| 亚洲日本成人在线观看| 国产日韩欧美电影| 狠狠狠色丁香婷婷综合激情 | 亚洲国产欧美在线| 欧美中文字幕不卡| 日韩电影一区二区三区四区| 欧美va在线播放| 成人福利视频网站| 亚洲综合久久av| 日韩欧美精品在线| av电影在线观看一区| 亚洲一区影音先锋| 欧美精品一区二区三| 97久久超碰国产精品| 天堂久久久久va久久久久| 精品久久久久久久人人人人传媒| 岛国av在线一区| 亚洲午夜日本在线观看| 26uuu亚洲| 色哟哟一区二区三区| 蜜臀av亚洲一区中文字幕| 亚洲国产精品国自产拍av| 欧美色倩网站大全免费| 国产酒店精品激情| 有坂深雪av一区二区精品| 欧美成人在线直播| 日本韩国一区二区| 国产在线视频一区二区| 洋洋成人永久网站入口| 久久美女高清视频| 欧美日韩国产精品成人| 成人免费av在线| 麻豆精品新av中文字幕| 一区二区成人在线| 国产欧美日韩精品a在线观看| 欧美日韩国产高清一区二区三区| 日韩欧美一级精品久久| aaa国产一区| 精品系列免费在线观看| 亚洲一二三四在线观看| 中国av一区二区三区| 欧美电影精品一区二区| 欧美又粗又大又爽| 成人a免费在线看| 国产一区二区三区视频在线播放| 午夜精品爽啪视频| 亚洲人成影院在线观看| 亚洲国产精品黑人久久久| 日韩欧美久久久| 在线播放视频一区| 精品污污网站免费看| 色综合色狠狠天天综合色| 中文字幕亚洲区| 精品视频一区三区九区| 国产99久久精品| 蜜桃久久久久久久| 性欧美大战久久久久久久久| 1024成人网| 中文字幕一区不卡| 日本一区二区视频在线观看| 欧美大片一区二区| 日韩女同互慰一区二区| 91精品国产综合久久久久久漫画| 欧美影院一区二区三区| 在线这里只有精品| 欧美手机在线视频| 欧美日韩亚洲国产综合| 欧美日韩视频在线观看一区二区三区 | 99久久久精品| 成人一区二区视频| www.在线成人| 91蜜桃免费观看视频| 99久久久久久99| 91国产精品成人| 欧美午夜电影一区| 91精品国产全国免费观看| 欧美一级片在线观看| 欧美一区二区视频在线观看2020| 宅男噜噜噜66一区二区66| 91精品国产91久久综合桃花| 日韩三级伦理片妻子的秘密按摩| 91精品国产综合久久久久久漫画| 日韩欧美一级精品久久| 日韩免费高清视频| 久久精品国产999大香线蕉| 日韩av在线发布| 蜜桃av一区二区| 精品中文av资源站在线观看| 黄色精品一二区| 成人午夜av影视| 色婷婷久久久亚洲一区二区三区| 欧美网站一区二区| 3d动漫精品啪啪一区二区竹菊 | 亚洲国产成人高清精品| 日韩精品91亚洲二区在线观看| 日韩国产精品久久| 黄色日韩网站视频| 91麻豆精品一区二区三区| 欧美性生活久久| 日韩精品中文字幕在线一区| 国产亚洲综合色| 亚洲国产中文字幕在线视频综合| 日韩精品电影一区亚洲| 国产成人免费视频一区| 欧美在线视频全部完| 精品成人在线观看| 国产精品嫩草影院com| 亚洲成人黄色影院| 国产伦精品一区二区三区免费迷| 97久久超碰精品国产| 日韩一二三区视频| 亚洲视频香蕉人妖| 久久国产精品免费| 一本大道久久a久久综合婷婷 | 99re热这里只有精品视频| 91.xcao| 综合中文字幕亚洲| 精品在线观看免费| 欧美综合视频在线观看| 久久亚洲影视婷婷| 亚洲18色成人| 91免费精品国自产拍在线不卡| 日韩欧美在线综合网| 亚洲精品视频在线看| 国产精品影视在线| 6080午夜不卡| 一区二区三区四区在线免费观看| 九九九精品视频| 精品视频在线免费观看| 国产精品狼人久久影院观看方式| 美女免费视频一区二区| 欧美色偷偷大香| 亚洲免费av在线| 日韩女优av电影| 亚洲综合色成人| 床上的激情91.| 久久亚洲私人国产精品va媚药| 午夜影院在线观看欧美| 91天堂素人约啪| 欧美国产视频在线| 国产在线精品视频| 日韩欧美电影一区| 午夜视频在线观看一区二区三区| 国产.欧美.日韩| 久久精品日韩一区二区三区| 美女视频黄 久久| 欧美一区二区三区视频在线| 亚洲h精品动漫在线观看| 日本精品视频一区二区三区| 国产精品国产馆在线真实露脸 | 欧美在线视频日韩| 亚洲精品一二三| 91免费观看国产| 中文字幕日韩精品一区| 成人黄色在线看| 欧美国产欧美综合| 国产99久久久精品| 国产精品视频麻豆| 不卡电影免费在线播放一区| 亚洲国产精品传媒在线观看| 国产剧情av麻豆香蕉精品| 久久午夜电影网| 国产大陆精品国产| 国产精品理论在线观看| 不卡av在线网| 亚洲精品成人悠悠色影视| 色94色欧美sute亚洲线路二 | 久久众筹精品私拍模特| 精品一区二区三区在线观看| 精品卡一卡二卡三卡四在线| 国产综合成人久久大片91| 久久九九久久九九| 99久久99久久精品免费观看| 亚洲欧美激情小说另类| 精品视频在线免费观看| 日韩精品一卡二卡三卡四卡无卡| 欧美一区二区在线不卡| 国产精品影音先锋| 亚洲婷婷在线视频| 欧洲视频一区二区| 青青青伊人色综合久久| 久久五月婷婷丁香社区| 波波电影院一区二区三区| 亚洲国产精品自拍| 精品国产伦一区二区三区观看方式| 国产精品综合在线视频| 中文字幕一区在线观看视频| 在线观看国产日韩| 久久91精品久久久久久秒播| 国产日韩精品一区二区三区 | 亚洲精品老司机| 正在播放亚洲一区| 国产69精品久久久久毛片|