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

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

?? tree.h

?? 樹跟二叉樹完整試用版 請選擇:(1)建立二叉樹:(2)建立二樹:(3)幫助:(4)退出:
?? 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一区二区三区免费野_久草精品视频
色88888久久久久久影院野外| 一区二区三区日本| 国产裸体歌舞团一区二区| 欧美成人精品福利| 国内成人精品2018免费看| 久久一夜天堂av一区二区三区| 国产一区在线观看麻豆| 国产精品人成在线观看免费| 色综合天天综合网天天看片| 亚洲高清中文字幕| 欧美一卡二卡在线观看| 国产乱人伦偷精品视频不卡| 国产精品国产三级国产aⅴ入口 | 亚洲激情男女视频| 欧美久久一二三四区| 精品在线观看视频| 最新日韩在线视频| 欧美精品九九99久久| 国产一区二区精品久久99| 中文字幕中文字幕中文字幕亚洲无线| 在线这里只有精品| 免费在线看一区| 欧美国产精品专区| 欧美久久婷婷综合色| 国产麻豆成人精品| 亚洲国产精品一区二区久久| 亚洲精品一区二区三区影院| 97精品久久久午夜一区二区三区| 男男gaygay亚洲| 亚洲欧洲日韩综合一区二区| 欧美一区二区三区日韩视频| 99re热视频这里只精品| 日本不卡视频在线观看| 国产精品不卡在线观看| 日韩欧美高清dvd碟片| 99麻豆久久久国产精品免费优播| 欧美a级理论片| 亚洲欧美日韩综合aⅴ视频| 日韩免费观看高清完整版| 色网综合在线观看| 国产酒店精品激情| 丝袜亚洲精品中文字幕一区| 亚洲欧洲日韩综合一区二区| 久久中文娱乐网| 欧美福利视频导航| 日本精品裸体写真集在线观看| 国产乱码精品一区二区三| 亚洲不卡av一区二区三区| 中文字幕在线一区二区三区| 日韩欧美国产wwwww| 欧美日韩欧美一区二区| 色婷婷精品久久二区二区蜜臀av| 国产高清精品在线| 奇米色一区二区三区四区| 一区二区三区精品视频在线| 国产精品毛片a∨一区二区三区| 欧美成人vr18sexvr| 欧美酷刑日本凌虐凌虐| 欧美在线免费播放| 一本一道久久a久久精品| 成人丝袜视频网| 国产传媒欧美日韩成人| 免播放器亚洲一区| 午夜电影久久久| 亚洲午夜久久久| 亚洲精品免费电影| 亚洲少妇最新在线视频| 国产精品成人免费在线| 中文子幕无线码一区tr| 国产嫩草影院久久久久| 日本一区二区三区国色天香| 亚洲精品一区二区三区四区高清 | 欧美高清在线精品一区| 久久精品视频网| 国产午夜久久久久| 国产清纯美女被跳蛋高潮一区二区久久w | 91精品国产综合久久久久久| 欧美日韩综合不卡| 欧美久久一二三四区| 91麻豆精品国产91久久久久久久久| 欧洲视频一区二区| 欧美午夜不卡在线观看免费| 欧美色倩网站大全免费| 欧美午夜寂寞影院| 91精品午夜视频| 欧美一级午夜免费电影| 精品黑人一区二区三区久久| 欧美videossexotv100| 久久理论电影网| 国产欧美一区二区三区沐欲| 国产欧美日韩中文久久| 国产精品久线观看视频| 亚洲精品v日韩精品| 午夜伦理一区二区| 裸体一区二区三区| 国产精品综合网| 99精品视频在线播放观看| 在线亚洲高清视频| 69堂成人精品免费视频| 久久久久久久免费视频了| 亚洲欧洲在线观看av| 亚洲国产日韩a在线播放性色| 久久精品国产99国产| 国产成人免费视频网站| 在线观看视频91| 日韩免费福利电影在线观看| 国产日产精品1区| 亚洲综合在线电影| 久久精品72免费观看| 懂色av一区二区三区蜜臀| 欧美亚洲日本一区| 精品久久久久久亚洲综合网| 日韩理论片一区二区| 日产国产欧美视频一区精品| 国产成人亚洲综合a∨猫咪| 欧美午夜影院一区| 国产亚洲精品bt天堂精选| 亚洲激情校园春色| 国产一区二区福利| 欧美中文字幕亚洲一区二区va在线 | 一区二区久久久久| 久久成人综合网| 色婷婷激情一区二区三区| 日韩欧美国产电影| 一区二区国产盗摄色噜噜| 激情六月婷婷综合| 欧美日韩成人一区| 最新欧美精品一区二区三区| 久久aⅴ国产欧美74aaa| 欧美性大战xxxxx久久久| 欧美国产成人在线| 精品亚洲成av人在线观看| 欧美主播一区二区三区美女| 欧美国产一区视频在线观看| 午夜天堂影视香蕉久久| av动漫一区二区| 久久久精品影视| 免费在线欧美视频| 欧美日韩国产另类不卡| 亚洲欧美经典视频| 成人午夜电影小说| 日韩欧美一区二区久久婷婷| 亚洲亚洲人成综合网络| av在线一区二区三区| 国产人久久人人人人爽| 国内精品国产成人国产三级粉色| 91精品欧美一区二区三区综合在 | 欧美成人三级在线| 首页综合国产亚洲丝袜| 欧美性大战xxxxx久久久| 亚洲人成伊人成综合网小说| 成人av在线观| 国产欧美综合在线观看第十页| 久久99国产精品免费网站| 欧美一级精品在线| 日韩电影在线免费| 51精品久久久久久久蜜臀| 亚洲大型综合色站| 精品视频在线免费观看| 一区二区三区不卡视频| 一本大道综合伊人精品热热| 成人欧美一区二区三区小说| 岛国精品在线观看| 国产精品毛片a∨一区二区三区| 风间由美性色一区二区三区| 欧美高清在线视频| 成a人片国产精品| 中文字幕亚洲在| 色综合久久88色综合天天6| 亚洲激情一二三区| 欧美丝袜丝nylons| 日韩精品国产欧美| 欧美一卡二卡在线| 国产一区二区三区电影在线观看| 久久久久久久网| av成人老司机| 亚洲高清免费在线| 欧美一个色资源| 国产综合成人久久大片91| 国产日韩欧美精品电影三级在线| 国产xxx精品视频大全| 亚洲天堂精品在线观看| 欧美色欧美亚洲另类二区| 日本不卡在线视频| 欧美一区二区三区免费视频 | 国产激情一区二区三区桃花岛亚洲| 日本一区二区三区在线观看| 91亚洲永久精品| 亚洲成人福利片| 亚洲精品一区二区三区99| 成人av综合在线| 亚洲一区二区av在线| 日韩一区二区在线观看视频| 国产在线播放一区| 亚洲欧美偷拍三级| 欧美一激情一区二区三区| 懂色av噜噜一区二区三区av| 亚洲午夜精品网| www国产精品av| 色综合中文字幕国产|