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

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

?? binarytree.h

?? 二叉樹最短路徑問題
?? H
字號:
// BinaryTree.h: 樹的類定義
//文件名稱: BinaryTree.h
//項目名稱:shortest_way_main.dsw
//創(chuàng)建者:黃冀渝
//創(chuàng)建時間:Sept.30 2004
//最后修改時間:Oct.6 2004
//功能: 打印給定兩個結(jié)點的最短路徑
 
//與其他文件的依賴關(guān)系:頭文件
#include "BinaryTreeNode.h"
#include <stack>
#include <queue>

//類名稱:BinaryTree 
//定義該類的目的:樹定義
//類屬性:基類
//類中函數(shù)及功能:詳見注釋
//與其他類的關(guān)系(調(diào)用/被調(diào)用哪類對象中的什么函數(shù)):是BinaryTreeNode類的友元
template <class T>
class BinaryTree  
{
protected:
	BinaryTreeNode<T>*  root;      							//二叉樹根結(jié)點指針
public:
	BinaryTree(){root=NULL;};								//構(gòu)造函數(shù)
	virtual ~BinaryTree(){DeleteBinaryTree(root);};			//析構(gòu)函數(shù)
	bool isEmpty() const							
	{return ((root == NULL)?true:false);};							//判定二叉樹是否為空樹
	BinaryTreeNode<T>* getRoot(){return root;};
	void Initialize(BinaryTreeNode<T>* pointer){root=pointer;};
	//刪除二叉樹或其子樹
	void DeleteBinaryTree(BinaryTreeNode<T>* root);		
	//從二叉樹的root結(jié)點開始,查找current結(jié)點的父結(jié)點
	BinaryTreeNode<T>* GetParent(BinaryTreeNode<T>* root,BinaryTreeNode<T>* current);
	//前序遍歷打印二叉樹
	void PreOrderPrint(BinaryTreeNode<T>* root);
	//指定內(nèi)容,前序遍歷得到指針
	BinaryTreeNode<T>* PreOrderGetPointer(BinaryTreeNode<T>* root, T element); 
 
	//按照中序輸入內(nèi)容產(chǎn)生對應(yīng)的樹
	BinaryTreeNode<T>* GenerateTree(T* num);
	//一個打印從祖先到子孫(自下而上)的函數(shù),利用遞歸實現(xiàn)
	int Print_upTodown(BinaryTreeNode<T>* p,BinaryTreeNode<T>* node);
	//打印兩個結(jié)點的最短路徑
	void PrintPath( BinaryTreeNode<T>* ancestor,BinaryTreeNode<T>* Node1,BinaryTreeNode<T>* Node2);
	//前序遞歸查找結(jié)點
	bool PreOrder_Search(BinaryTreeNode<T>* root, T element);
	//尋找兩個結(jié)點的最近的公共祖先并將找到的祖先返回
	BinaryTreeNode<T>* FindAncestor(BinaryTreeNode<T>* root, T ele1, T ele2);

};
//函數(shù)名稱:GetParent
//函數(shù)功能描述:返回父結(jié)點
//函數(shù)調(diào)用之前的預(yù)備條件:傳入根結(jié)點
//返回值(如果有的話):父結(jié)點指針
//函數(shù)的輸入?yún)?shù):根結(jié)點、目標(biāo)結(jié)點
//函數(shù)的輸出參數(shù):無
//函數(shù)與其他對象中函數(shù)的調(diào)用和被調(diào)用關(guān)系:被Print_upTodown調(diào)用
template<class T>
BinaryTreeNode<T>* BinaryTree<T>::GetParent(BinaryTreeNode<T>* root,BinaryTreeNode<T>* current)
{
	//從二叉樹的root結(jié)點開始,查找current結(jié)點的父結(jié)點
	if(root == current)
		return root;
	BinaryTreeNode<T>* temp;
	if(root==NULL)
		return NULL;
	//找到父結(jié)點
	if((root->leftchild()==current)||(root->rightchild()==current))
		return root;
	//遞歸尋找父結(jié)點
	else if((temp=GetParent(root->leftchild(),current)) != NULL)
			return temp;
		else return GetParent(root->rightchild(),current);	
}
//函數(shù)名稱:DeleteBinaryTree
//函數(shù)功能描述:刪除樹
//函數(shù)調(diào)用之前的預(yù)備條件:樹存在
//返回值(如果有的話):無
//函數(shù)的輸入?yún)?shù):根結(jié)點指針
//函數(shù)的輸出參數(shù):無
//函數(shù)與其他對象中函數(shù)的調(diào)用和被調(diào)用關(guān)系:被析溝函數(shù)調(diào)用
template<class T>
void BinaryTree<T>::DeleteBinaryTree(BinaryTreeNode<T>* root)		//刪除二叉樹或其子樹
{

    if(root != NULL)
	{
		DeleteBinaryTree(root->left);
		DeleteBinaryTree(root->right);
		delete root;
	}
}
//函數(shù)名稱:PreOrderPrint
//函數(shù)功能描述:前序遍歷打印樹
//函數(shù)調(diào)用之前的預(yù)備條件:已經(jīng)存在樹
//返回值(如果有的話):無
//函數(shù)的輸入?yún)?shù):根結(jié)點指針
//函數(shù)的輸出參數(shù):縮進樹的圖形
//函數(shù)與其他對象中函數(shù)的調(diào)用和被調(diào)用關(guān)系:被主函數(shù)調(diào)用
template<class T>
void BinaryTree<T>::PreOrderPrint(BinaryTreeNode<T>* root){ //前序縮進打印樹
	static int tab = 0; //靜態(tài)局部變量用于記錄縮進值
	if (root != NULL){		
		for (int i = 1; i <= tab; i++)
			cout<<"\t";
		cout<< root->value()<< endl;
		tab++;
		PreOrderPrint(root->leftchild());
		PreOrderPrint(root->rightchild());
		tab--;
	}
}
//函數(shù)名稱:PreOrderGetPointer
//函數(shù)功能描述:前序遍歷找到給定結(jié)點的指針
//函數(shù)調(diào)用之前的預(yù)備條件:傳入根結(jié)點
//返回值(如果有的話):給定內(nèi)容的結(jié)點的指針
//函數(shù)的輸入?yún)?shù):根結(jié)點和給定內(nèi)容
//函數(shù)的輸出參數(shù):無
//函數(shù)與其他對象中函數(shù)的調(diào)用和被調(diào)用關(guān)系:被主函數(shù)調(diào)用
template<class T>
BinaryTreeNode<T>* PreOrderGetPointer(BinaryTreeNode<T>* root, T element)
//前序遍歷二叉樹或其子樹得到結(jié)點的指針
{	
	if (root == NULL)//就是這個地方忘了寫害我debug了很久~_~
		return NULL;
	if (root->value() == element)			//訪問當(dāng)前結(jié)點
			return root;
	if(root->isLeaf() == false){	
		BinaryTreeNode<T>* p = NULL;
	    if ((p = PreOrderGetPointer(root->leftchild(),element) ) != NULL)//訪問左子樹
			return p;
		else
			return PreOrderGetPointer(root->rightchild(),element);			//訪問右子樹
	}
	return NULL; //用于當(dāng)遍歷結(jié)束都找不到element時,返回null
}
//函數(shù)名稱:PreOrder_Search
//函數(shù)功能描述:前序遞歸查找某個結(jié)點
//函數(shù)調(diào)用之前的預(yù)備條件:傳入根結(jié)點
//返回值(如果有的話):bool值。true代表存在,false代表不存在
//函數(shù)的輸入?yún)?shù):根指針和某個結(jié)點內(nèi)容
//函數(shù)的輸出參數(shù):無
//函數(shù)與其他對象中函數(shù)的調(diào)用和被調(diào)用關(guān)系:被FindAncestor調(diào)用 

template<class T>
bool BinaryTree<T>::PreOrder_Search(BinaryTreeNode<T>* root,T ele)//查找一個結(jié)點
{
	if(root!=NULL)
	{
		if (root->value() == ele )			//訪問當(dāng)前結(jié)點
			return true;
			
		bool b1 = PreOrder_Search(root->leftchild(), ele);			//訪問左子樹
		bool b2 = PreOrder_Search(root->rightchild(), ele);			//訪問右子樹
		return b1||b2;
	}
	return false;
}
//函數(shù)名稱:FindAncestor
//函數(shù)功能描述:尋找兩個結(jié)點的公共祖先
//函數(shù)調(diào)用之前的預(yù)備條件:傳入根結(jié)點、兩個操作結(jié)點
//返回值(如果有的話):祖先指針
//函數(shù)的輸入?yún)?shù):根結(jié)點、兩個操作結(jié)點
//函數(shù)的輸出參數(shù):無
//函數(shù)與其他對象中函數(shù)的調(diào)用和被調(diào)用關(guān)系:被主函數(shù)調(diào)用,調(diào)用PreOrder_Search
template<class T>
BinaryTreeNode<T>* BinaryTree<T>::FindAncestor(BinaryTreeNode<T>* root, T ele1, T ele2)
{
	if ( PreOrder_Search(root, ele1)==false 
		||PreOrder_Search(root, ele2)==false )
			return NULL; //樹中不存在某個參數(shù)結(jié)點  

	if (root == NULL)
		return NULL;
	else if( root->value() == ele1 || root->value() == ele2 )
		return root;

	bool b1 = PreOrder_Search(root->leftchild(), ele1);
	bool b2 = PreOrder_Search(root->leftchild(), ele2); //都去左邊找
	
	if (b1 == true && b2 == true)
		return FindAncestor(root->leftchild(), ele1, ele2);
	else if (b1 == false && b2 == false)
		return FindAncestor(root->rightchild(), ele1, ele2);
	else											//各在一邊
			return root;
}
//函數(shù)名稱:Print_upTodown
//函數(shù)功能描述:從頭向下打印路徑
//函數(shù)調(diào)用之前的預(yù)備條件:傳入根結(jié)點和被打印結(jié)點
//返回值(如果有的話):路徑長度
//函數(shù)的輸入?yún)?shù):根結(jié)點和被打印結(jié)點
//函數(shù)的輸出參數(shù):路徑
//函數(shù)與其他對象中函數(shù)的調(diào)用和被調(diào)用關(guān)系:被PrintPath調(diào)用
template<class T>
int BinaryTree<T>::Print_upTodown(BinaryTreeNode<T>* p,BinaryTreeNode<T>* node)
{
	static int nCount = 0; //計數(shù)器
	if (p == node) //跳出遞歸
	{
		p->visit();
		return 0;
	}
	Print_upTodown(p, GetParent(p,node));
	cout<< " --> ";
	nCount++;
	node->visit();
	
	return nCount; //將計數(shù)器返回
}
//函數(shù)名稱:PrintPath
//函數(shù)功能描述:打印兩個結(jié)點的路徑
//函數(shù)調(diào)用之前的預(yù)備條件:已經(jīng)找到公共祖先
//返回值(如果有的話):無
//函數(shù)的輸入?yún)?shù):兩個結(jié)點(可以相同)及其公共祖先
//函數(shù)的輸出參數(shù):路徑和路徑長度
//函數(shù)與其他對象中函數(shù)的調(diào)用和被調(diào)用關(guān)系:調(diào)用GetParent和Print_upTodown
template<class T>
void BinaryTree<T>::PrintPath(BinaryTreeNode<T>* p,BinaryTreeNode<T>* n1,BinaryTreeNode<T>* n2)
{
	//實參p是指向公共祖先的指針
	//先打印從Node1到祖先的路徑
	static int nCount1 = 0; //計數(shù)器1
	if(n1 != p)
		do{
			n1->visit();
			cout<< " --> ";
			nCount1++;
			n1 = GetParent(p,n1);
		}while (n1 != p);

	//再利用一個遞歸函數(shù)來實現(xiàn)從祖先打印到n2。
	int nCount2 = Print_upTodown(p, n2); //計數(shù)器2
	cout<< "\n他們的路徑長度之和為 "
		<< nCount1 + nCount2
		<< " 個邊徑單位(edge)\n";
}
//函數(shù)名稱:GenerateTree
//函數(shù)功能描述:按照前序輸入內(nèi)容產(chǎn)生對應(yīng)的樹
//函數(shù)調(diào)用之前的預(yù)備條件:有一個前序表達(dá)式
//返回值(如果有的話):根結(jié)點的指針
//函數(shù)的輸入?yún)?shù):表達(dá)式指針
//函數(shù)的輸出參數(shù):無
//函數(shù)與其他對象中函數(shù)的調(diào)用和被調(diào)用關(guān)系:被主函數(shù)調(diào)用
template<class T>
BinaryTreeNode<T>* BinaryTree<T>::GenerateTree(T* head) //按照前序輸入內(nèi)容產(chǎn)生對應(yīng)的樹
{
	static T* p = head;
	if(*p == '^' || *p == '\0') //后面的條件*p == '\0'是沒有必要的,但是當(dāng)有某些特殊情況的時候
								//(例如程序被修改使得某些預(yù)判斷輸入正確的函數(shù)失效時)
								//它可以增強程序的乳棒性,故做了保留
		return NULL;

	BinaryTreeNode<T>* pNode = new BinaryTreeNode<T>;
	pNode->setValue(*p);
	pNode->setLeftchild(GenerateTree(++p) );
	pNode->setRightchild(GenerateTree(++p) );
	return pNode;
}

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产东北露脸精品视频| 久久成人免费日本黄色| 99久久伊人久久99| 欧美高清一级片在线观看| 国产精品性做久久久久久| 欧美激情在线一区二区| 成人sese在线| 亚洲激情男女视频| 6080午夜不卡| 国产综合色在线| 国产女同互慰高潮91漫画| av中文一区二区三区| 国产精品美女久久久久高潮| 91麻豆蜜桃一区二区三区| 一区二区三区色| 在线播放欧美女士性生活| 国产一区二区免费视频| 国产精品毛片久久久久久久| 欧美伊人精品成人久久综合97 | 亚洲欧美日韩在线播放| 在线观看亚洲a| 麻豆成人久久精品二区三区红| 久久久久久久国产精品影院| 91麻豆福利精品推荐| 性做久久久久久免费观看欧美| 欧美成人video| 99精品一区二区三区| 日韩成人一级片| 久久日一线二线三线suv| 99久久精品99国产精品| 日韩成人伦理电影在线观看| 国产欧美一区二区三区沐欲| 欧美曰成人黄网| 韩国三级电影一区二区| 亚洲一区免费在线观看| 精品sm捆绑视频| 欧美在线视频你懂得| 国产一区二区三区不卡在线观看| 一区二区三区在线不卡| 久久综合狠狠综合| 欧美美女一区二区三区| av在线不卡观看免费观看| 奇米亚洲午夜久久精品| 亚洲欧美日韩人成在线播放| 欧美mv日韩mv亚洲| 精品视频一区 二区 三区| bt欧美亚洲午夜电影天堂| 日本欧美一区二区| 亚洲综合色网站| 中文在线一区二区| 日韩欧美国产三级| 在线观看免费成人| 成人精品小蝌蚪| 激情国产一区二区| 日韩中文字幕亚洲一区二区va在线| 中文字幕在线不卡| 久久久亚洲精品石原莉奈| 欧美一级在线免费| 欧美性受xxxx| 一本高清dvd不卡在线观看| 国产一区二区免费在线| 免费xxxx性欧美18vr| 亚洲国产人成综合网站| 亚洲视频在线一区观看| 国产日产精品一区| 337p日本欧洲亚洲大胆色噜噜| 欧美精品一二三| 在线观看免费亚洲| 色综合久久久久久久久久久| 成人国产精品免费观看动漫| 国产精品白丝jk黑袜喷水| 另类小说视频一区二区| 日韩不卡免费视频| 日韩福利视频导航| 日韩国产精品久久久久久亚洲| 亚洲在线视频一区| 亚洲综合色成人| 亚洲九九爱视频| 亚洲精品视频自拍| 中文字幕亚洲一区二区va在线| 国产精品少妇自拍| 国产精品久久久久久久久图文区 | 欧美在线播放高清精品| 在线视频国内自拍亚洲视频| 在线观看日韩高清av| 91久久精品网| 欧美年轻男男videosbes| 欧美老人xxxx18| 69p69国产精品| 精品国产乱码久久久久久1区2区| 精品国产乱码久久久久久免费 | 在线中文字幕不卡| 91久久精品午夜一区二区| 欧美三级资源在线| 日韩三级av在线播放| 欧美成人伊人久久综合网| 久久综合九色综合97婷婷| 国产欧美一区二区三区鸳鸯浴| 成人欧美一区二区三区在线播放| 亚洲免费观看视频| 亚洲成人高清在线| 久久99久久99小草精品免视看| 寂寞少妇一区二区三区| 成人黄色a**站在线观看| 欧美亚男人的天堂| 日韩午夜激情视频| 国产日韩欧美一区二区三区乱码| 国产精品国产馆在线真实露脸| 亚洲美女视频在线| 日本女优在线视频一区二区| 国产精品资源在线观看| 色香蕉久久蜜桃| 日韩一级高清毛片| 国产精品久久久久一区二区三区共| 亚洲人成人一区二区在线观看| 日日嗨av一区二区三区四区| 国产老肥熟一区二区三区| 91在线小视频| 3d成人动漫网站| 欧美激情一区三区| 五月婷婷综合在线| 高清在线不卡av| 欧美日韩黄色影视| 日本一区二区视频在线| 亚洲综合一区在线| 大尺度一区二区| 欧美剧情电影在线观看完整版免费励志电影| 欧美不卡一二三| 亚洲精品免费视频| 国产精品影视天天线| 欧美日韩在线播放一区| 国产欧美日韩视频一区二区| 天堂影院一区二区| 色综合一个色综合| 精品国产成人系列| 亚洲高清中文字幕| 99久久免费精品高清特色大片| 日韩欧美国产三级电影视频| 一区二区三区免费在线观看| 高清不卡在线观看| 精品电影一区二区三区 | 日产国产欧美视频一区精品| 99综合电影在线视频| 欧美大片顶级少妇| 亚洲成人激情综合网| jlzzjlzz欧美大全| 久久久久久久久久久久久久久99| 日韩专区中文字幕一区二区| 色婷婷综合久久久| 国产精品久久免费看| 国产福利一区二区| 日韩免费福利电影在线观看| 亚洲一区二区三区四区五区黄| 成人av在线影院| 久久久无码精品亚洲日韩按摩| 奇米亚洲午夜久久精品| 欧美理论电影在线| 亚洲电影一区二区| 色先锋aa成人| 综合久久给合久久狠狠狠97色 | eeuss影院一区二区三区| 国产亚洲精品精华液| 九一久久久久久| 欧美一级精品大片| 日韩不卡一区二区| 欧美一区二区三区视频免费| 丝袜亚洲另类欧美| 欧美放荡的少妇| 日本sm残虐另类| 7777女厕盗摄久久久| 视频在线观看一区| 欧美男男青年gay1069videost| 天堂一区二区在线| 宅男噜噜噜66一区二区66| 亚洲成人资源在线| 欧美一区二区国产| 美女一区二区视频| 久久综合色之久久综合| 国产精品一区二区久久精品爱涩| 国产偷国产偷亚洲高清人白洁| 国产黄色精品网站| 国产精品乱码妇女bbbb| 99精品欧美一区二区三区小说 | 精品视频一区二区不卡| 亚洲成人激情综合网| 欧美一区二区免费视频| 免费xxxx性欧美18vr| 国产日产欧美一区二区三区| 99久久国产综合精品色伊| 亚洲国产欧美日韩另类综合| 91精品国产综合久久香蕉麻豆| 精品综合久久久久久8888| 中文字幕不卡在线播放| 欧美亚洲综合久久| 麻豆成人免费电影| 国产精品女上位| 欧美日韩亚洲综合一区二区三区| 日韩不卡一区二区三区| 欧美激情艳妇裸体舞| 欧美性色黄大片|