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

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

?? binarytree1.h

?? BinaryTree的定義以及相關函數的實現
?? H
字號:
// BinaryTree1.h: interface for the BinaryTree class.
//
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_BINARYTREE1_H__99C2FAA0_E42F_4CB0_8B01_C36F1FA6F1EE__INCLUDED_)
#define AFX_BINARYTREE1_H__99C2FAA0_E42F_4CB0_8B01_C36F1FA6F1EE__INCLUDED_

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

#include "BinaryTreeNode.h"
#include <stack>
#include <queue>

enum Tags{Left,Right};

template <class T>
class StackElement
{
public:
	BinaryTreeNode<T>* pointer;
	Tags tag;
};	

template <class T>
class BinaryTree  
{
protected:
	BinaryTreeNode<T>*  root;      							//二叉樹根結點指針
public:
	BinaryTree(){root=NULL;};								//構造函數
	virtual ~BinaryTree(){DeleteBinaryTree(root);};			//析構函數
	bool isEmpty() const{return ((root)?true:false);};		//判定二叉樹是否為空樹
	BinaryTreeNode<T>* getRoot(){return root;};
	void Initialize(BinaryTreeNode<T>* pointer){root=pointer;};	

	BinaryTreeNode<T>* GetParent(BinaryTreeNode<T>* root,BinaryTreeNode<T>* current);	//從二叉樹的root結點開始,查找current結點的父結點
	BinaryTreeNode<T>* Parent(BinaryTreeNode<T>* current);								//返回current結點的父結點指針
	BinaryTreeNode<T>* LeftSibling(BinaryTreeNode<T>* current);							//返回current結點的左兄弟
	BinaryTreeNode<T>* RightSibling(BinaryTreeNode<T>* current);						//返回current結點的右兄弟
	void CreateTree(const T& elem, BinaryTree<T>& leftTree, BinaryTree<T>& rightTree);	//以elem作為根結點,leftTree作為樹的左子樹,rightTree作為樹的右子樹,構造一棵新的二叉樹

	void DeleteBinaryTree(BinaryTreeNode<T>* root);			//刪除二叉樹或其子樹
	void PreOrder(BinaryTreeNode<T>* root);					//前序遍歷二叉樹或其子樹
	void InOrder(BinaryTreeNode<T>* root);					//中序遍歷二叉樹或其子樹
	void PostOrder(BinaryTreeNode<T>* root);				//后序遍歷二叉樹或其子樹
	void PreOrderWithoutRecusion(BinaryTreeNode<T>* root);	//非遞歸前序遍歷二叉樹或其子樹
	void InOrderWithoutRecusion(BinaryTreeNode<T>* root);	//非遞歸中序遍歷二叉樹或其子樹
	void PostOrderWithoutRecusion(BinaryTreeNode<T>* root);	//非遞歸后序遍歷二叉樹或其子樹
	void PostOrderWithoutRecusion2(BinaryTreeNode<T>* root);//非遞歸后序遍歷二叉樹或其子樹, 另一個版本
	void LevelOrder(BinaryTreeNode<T>* root);				//按層次遍歷二叉樹或其子樹
};

//從二叉樹的root結點開始,查找current結點的父結點___________________________________________________________________
template<class T>
BinaryTreeNode<T>* BinaryTree<T>::GetParent(BinaryTreeNode<T>* root,BinaryTreeNode<T>* current)
{
	BinaryTreeNode<T>* temp;
	if(root==NULL)
		return NULL;
	if((root->leftchild()==current)||(root->rightchild()==current))	//找到父結點
		return root;
	if((temp=GetParent(root->leftchild(),current))!=NULL)			//遞歸尋找父結點
		return temp;
	else 
		return GetParent(root->rightchild(),current);	
}

//返回current結點的父結點指針_______________________________________________________________________________________
template<class T>
BinaryTreeNode<T>* BinaryTree<T>::Parent(BinaryTreeNode<T>* current)
{
	if((current==NULL)||(current==root))
		return NULL;					//空結點或者current為根結點時,返回NULL
	return GetParent(root,current);		//調用遞歸函數尋找父結點
}

//返回current結點的左兄弟___________________________________________________________________________________________
template<class T>
BinaryTreeNode<T>* BinaryTree<T>::LeftSibling(BinaryTreeNode<T>* current)	
{
	if(current){										//current不為空
		BinaryTreeNode<T>* temp=Parent(current);		//返回current結點的父結點
		if((temp==NULL)||current==temp->leftchild())
			return  NULL;								//如果父結點為空,或者current沒有左兄弟
		else return temp->leftchild();
	}
	return NULL;
}

//返回current結點的右兄弟___________________________________________________________________________________________
template<class T>
BinaryTreeNode<T>* BinaryTree<T>::RightSibling(BinaryTreeNode<T>* current)
{
	if(current){										//current不為空
		BinaryTreeNode<T>* temp=Parent(current);		//返回current結點的父結點
		if((temp==NULL)||current==temp->rightchild())	//如果父結點為空,或者current沒有右兄弟
			return  NULL;						
		else 
			return temp->rightchild();
	}
	return NULL;
}

//以elem作為根結點,leftTree作為樹的左子樹,rightTree作為樹的右子樹,構造一棵新的二叉樹_____________________________
template<class T>
void BinaryTree<T>::CreateTree(const T& elem, BinaryTree<T>& leftTree, BinaryTree<T>& rightTree)
{
	root=new BinaryTreeNode<T>(elem,leftTree.root,rightTree.root);  //創建新樹
	leftTree.root=rightTree.root=NULL;								//原來兩棵子樹的根結點指空,避免訪問

}

//刪除二叉樹或其子樹________________________________________________________________________________________________
template<class T>
void BinaryTree<T>::DeleteBinaryTree(BinaryTreeNode<T>* root)
{
	if(root){
		DeleteBinaryTree(root->left);
		DeleteBinaryTree(root->right);
		delete root;
	}
}

//前序遍歷二叉樹或其子樹____________________________________________________________________________________________
template<class T>
void BinaryTree<T>::PreOrder(BinaryTreeNode<T>* root)
{
	if(root!=NULL){
		AfxMessageBox(root->value());			//訪問當前結點
		PreOrder(root->leftchild());			//訪問左子樹
		PreOrder(root->rightchild());			//訪問右子樹
	}
}

//中序遍歷二叉樹或其子樹____________________________________________________________________________________________
template<class T>
void BinaryTree<T>::InOrder(BinaryTreeNode<T>* root)
{
	if(root!=NULL){
		InOrder (root->leftchild());			//訪問左子樹
		AfxMessageBox(root->value());			//訪問當前結點
		InOrder (root->rightchild());			//訪問右子樹
	}
}

//后序遍歷二叉樹或其子樹____________________________________________________________________________________________
template<class T>
void BinaryTree<T>::PostOrder(BinaryTreeNode<T>* root)
{
	if(root!=NULL){
		PostOrder(root->leftchild());			//訪問左子樹
		PostOrder (root->rightchild());			//訪問右子樹
		AfxMessageBox(root->value());			//訪問當前結點
	}
}

//非遞歸前序遍歷二叉樹或其子樹______________________________________________________________________________________
template<class T>
void BinaryTree<T>::PreOrderWithoutRecusion(BinaryTreeNode<T>* root)
{
	using std::stack;

	stack<BinaryTreeNode<T>* > aStack;
	BinaryTreeNode<T>* pointer=root;       		//保存輸入參數	

	while(!aStack.empty()||pointer)				
	{
		if(pointer){
			AfxMessageBox(pointer->value());	//訪問當前結點
			aStack.push(pointer);				//當前結點地址入棧
			pointer=pointer->leftchild();		//當前鏈接結構指向左孩子
		}
		else {	        						//左子樹訪問完畢,轉向訪問右子樹
			pointer=aStack.top();				//棧頂元素退棧                 
			aStack.pop();
			pointer=pointer->rightchild();		//當前鏈接結構指向右孩子
		} //else
	} //while
}

//非遞歸中序遍歷二叉樹或其子樹______________________________________________________________________________________
template<class T>
void BinaryTree<T>::InOrderWithoutRecusion(BinaryTreeNode<T>* root)	
{
	using std::stack;

	stack<BinaryTreeNode<T>* > aStack;
	BinaryTreeNode<T>* pointer=root;			//保存輸入參數	

	while(!aStack.empty()||pointer)				
	{
		if(pointer){
			aStack.push(pointer);				//當前結點地址入棧
			pointer=pointer->leftchild();		//當前鏈接結構指向左孩子
		}
		else {        							//左子樹訪問完畢,轉向訪問右子樹
			pointer=aStack.top();				
			AfxMessageBox(pointer->value());	//訪問當前結點
			pointer=pointer->rightchild(); 		//當前鏈接結構指向右孩子
			aStack.pop();						//棧頂元素退棧                 
		} //else
	} //while
}

//非遞歸后序遍歷二叉樹或其子樹______________________________________________________________________________________
template<class T>
void BinaryTree<T>::PostOrderWithoutRecusion(BinaryTreeNode<T>* root)
{
	using std::stack;
	StackElement<T> element;
	stack<StackElement<T > > aStack;
	BinaryTreeNode<T>* pointer;

	if(NULL==root)
		return;									//空樹即返回
	else 
		pointer=root;

	while(1)
	{
		while(pointer!=NULL)					//進入左子樹
		{
			element.pointer=pointer;
			element.tag=Left;
			aStack.push(element);
			pointer=pointer->leftchild();
		}
		
		element=aStack.top();					//托出棧頂元素
		aStack.pop();
		pointer=element.pointer;
		while(element.tag==Right)				//從右子樹回來
		{
			AfxMessageBox(pointer->value());	//訪問當前結點
			if(aStack.empty())
				return;
			else{
				element=aStack.top();
				aStack.pop();
				pointer=element.pointer;
			}
		}
		
		element.tag=Right;						//從左子樹回來
		aStack.push(element);
		pointer=pointer->rightchild();
	}
}

//非遞歸后序遍歷二叉樹或其子樹, 另一個版本__________________________________________________________________________
template<class T>
void BinaryTree<T>::PostOrderWithoutRecusion2(BinaryTreeNode<T>* root)
{
	using std::stack;
	stack<BinaryTreeNode<T>* > aStack;
	BinaryTreeNode<T> *p, *q;
	if(root==NULL)
		return;
	p=root;
	do{
		while(p!=NULL){							//沿左路分支下降			
		
			aStack.push(p);
			p=p->leftchild();
		}
		q=NULL;

		while(!aStack.empty())
		{
			p=aStack.top();
			aStack.pop();
			if(p->rightchild()==q){				//右子樹為空或剛剛被訪問過
				AfxMessageBox(p->value());		//訪問當前結點
				q=p;
			}
			else{
				aStack.push(p);
				p=p->rightchild();
				break;
			}
		}
	}while(!aStack.empty());
}

//按層次遍歷二叉樹或其子樹__________________________________________________________________________________________
template<class T>
void BinaryTree<T>::LevelOrder(BinaryTreeNode<T>* root)	
{
	using std::queue;
	queue<BinaryTreeNode<T>*> aQueue;
	BinaryTreeNode<T>* pointer=root;

	if(pointer)
		aQueue.push(pointer);
	while(!aQueue.empty())
	{
		pointer=aQueue.front();
		AfxMessageBox(pointer->value());				//訪問當前結點
		aQueue.pop();
		if(pointer->leftchild())
			aQueue.push(pointer->leftchild());
		if(pointer->rightchild())
			aQueue.push(pointer->rightchild());
	}
}

#endif // !defined(AFX_BINARYTREE1_H__99C2FAA0_E42F_4CB0_8B01_C36F1FA6F1EE__INCLUDED_)

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
中文字幕亚洲视频| 亚洲一区二区欧美| 亚洲免费观看高清完整 | 视频一区中文字幕| 国产激情精品久久久第一区二区 | 亚洲影院理伦片| 韩国中文字幕2020精品| av在线一区二区| 欧美电影精品一区二区| 中文字幕中文乱码欧美一区二区| 日韩av在线播放中文字幕| 99久久99久久久精品齐齐| 国产日产亚洲精品系列| 激情文学综合插| 日韩久久精品一区| 麻豆视频一区二区| 3d成人h动漫网站入口| 一区二区成人在线观看| 99久久精品国产精品久久| 欧美激情在线看| 懂色中文一区二区在线播放| 国产色一区二区| 国产精品亚洲视频| 国产无人区一区二区三区| 精品影视av免费| 精品久久久久99| 精品在线免费观看| 精品精品国产高清a毛片牛牛| 美日韩一级片在线观看| 日韩三级在线观看| 韩国三级中文字幕hd久久精品| 欧美一级精品大片| 黑人巨大精品欧美黑白配亚洲| 99久久99久久久精品齐齐| 香蕉加勒比综合久久| 色综合视频在线观看| 欧美高清一级片在线观看| 国产成人a级片| 国产精品大尺度| 91免费精品国自产拍在线不卡| 亚洲天堂av一区| 91麻豆国产福利在线观看| 国产精品久久久久久福利一牛影视| 国产激情视频一区二区在线观看 | 欧美日韩一区二区欧美激情| 午夜精彩视频在线观看不卡| 91精品国产麻豆国产自产在线| 日韩av在线免费观看不卡| 26uuu亚洲综合色| 国产激情一区二区三区| 亚洲色图清纯唯美| 欧美日韩专区在线| 激情成人午夜视频| 亚洲免费成人av| 91精品国产全国免费观看| 老司机精品视频一区二区三区| 久久免费看少妇高潮| 91麻豆国产福利精品| 五月天一区二区| 国产亚洲一区二区在线观看| 色噜噜狠狠成人网p站| 日本视频免费一区| 亚洲欧洲日韩一区二区三区| 欧美日韩三级视频| 国产毛片精品视频| 一区二区成人在线视频| 亚洲精品在线免费观看视频| 91老师片黄在线观看| 久久激五月天综合精品| 亚洲人成网站在线| 精品国产一区二区三区久久久蜜月| 不卡的av电影| 蜜臀a∨国产成人精品| 亚洲天堂网中文字| 久久夜色精品一区| 欧美电影影音先锋| 一本久久精品一区二区| 国产在线看一区| 亚洲18影院在线观看| 中文字幕av一区二区三区高 | 九一九一国产精品| 一区二区在线观看免费| 国产欧美综合在线观看第十页 | 久久99久国产精品黄毛片色诱| 中文字幕中文字幕在线一区| 精品国产凹凸成av人网站| 欧洲国产伦久久久久久久| 国产一区二区不卡老阿姨| 午夜私人影院久久久久| 亚洲视频香蕉人妖| 国产亚洲va综合人人澡精品 | 亚洲天堂2016| 中文字幕精品三区| 欧美r级电影在线观看| 欧美蜜桃一区二区三区| 日本韩国一区二区三区视频| 国产大陆a不卡| 久久99久久久欧美国产| 免费精品99久久国产综合精品| 亚洲线精品一区二区三区八戒| 亚洲青青青在线视频| 中文字幕一区二| 国产精品国产三级国产专播品爱网 | 亚洲人成精品久久久久久| 国产精品三级电影| 久久色在线观看| 欧美精品一区二区三区久久久| 欧美一区二区三区免费大片| 9191成人精品久久| 91精品啪在线观看国产60岁| 欧美美女网站色| 欧美猛男超大videosgay| 欧美久久久一区| 6080日韩午夜伦伦午夜伦| 宅男在线国产精品| 日韩免费电影网站| 国产性色一区二区| 亚洲欧洲精品一区二区精品久久久 | 日韩经典中文字幕一区| 香蕉成人伊视频在线观看| 午夜视频一区二区| 日韩av不卡一区二区| 蜜臀av国产精品久久久久| 久久电影网站中文字幕| 国产精品自拍在线| 成人avav在线| 欧美三级韩国三级日本三斤| 7777精品伊人久久久大香线蕉的 | 亚洲人成伊人成综合网小说| 亚洲一区二区三区在线看| 午夜av区久久| 国产一区二区免费在线| 成人av一区二区三区| 在线观看91精品国产入口| 欧美巨大另类极品videosbest | 日韩精品视频网站| 久久精品国产77777蜜臀| 成人午夜视频在线观看| 欧美在线小视频| 欧美成人综合网站| 亚洲欧洲日韩一区二区三区| 日韩激情视频网站| 国产精品99久久久| 色婷婷久久久久swag精品| 欧美一级午夜免费电影| 国产精品人人做人人爽人人添| 亚洲一区二区中文在线| 精品一区二区三区蜜桃| 91色在线porny| 欧美r级电影在线观看| 综合电影一区二区三区 | 中文字幕亚洲成人| 日韩国产高清在线| 99久久综合色| 日韩精品一区二| 亚洲另类中文字| 极品美女销魂一区二区三区 | 亚洲成人动漫精品| 国产ts人妖一区二区| 7777精品伊人久久久大香线蕉 | 一区二区三区高清不卡| 狠狠色综合色综合网络| 欧美日韩免费视频| 国产精品成人一区二区三区夜夜夜 | 久久www免费人成看片高清| 色综合久久综合| 久久久国产精品午夜一区ai换脸| 亚洲成人7777| 91亚洲精品久久久蜜桃| 久久青草国产手机看片福利盒子| 亚洲r级在线视频| 91视频精品在这里| 国产日韩欧美麻豆| 久久精品国产99久久6| 欧美亚洲一区二区在线观看| 国产精品久久久一区麻豆最新章节| 久久国产精品72免费观看| 欧美群妇大交群中文字幕| 亚洲精品久久嫩草网站秘色| 国产不卡视频一区二区三区| 精品免费视频一区二区| 日韩成人一级大片| 欧美日韩激情一区二区| 亚洲精品国产一区二区三区四区在线| 国产一区二区不卡老阿姨| 欧美电影免费观看高清完整版| 视频一区二区三区中文字幕| 欧美撒尿777hd撒尿| 伊人性伊人情综合网| 色婷婷久久综合| 亚洲精品成人在线| 99久久精品国产精品久久| 国产精品久久久久久久久免费丝袜| 国产一区二区电影| 国产欧美一区在线| 波多野结衣在线一区| 中文字幕亚洲欧美在线不卡| 91在线观看高清| 亚洲图片欧美色图| 欧美精品aⅴ在线视频|