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

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

?? binarytree.cpp

?? 用C++寫的尋找公共祖先
?? CPP
字號:
//:BinaryTree.cpp
//******************************************************
//Desinged by: Xinyun Yu	Date: 2006.4.16
//Implementation file for ADT BinaryTree in BinaryTree.h
//******************************************************
#include "BinaryTree.h"
#include "LinkedQueue.h"
#include "LinkedStack.h"
#include <iostream>
using namespace std;

BinaryTree::BinaryTree()
{
	root = 0;
} //end default constructor

BinaryTree::~BinaryTree()
{
	destroyTree(root);
} //end destructor

void BinaryTree::destroyTree(TreeNode* &node)
{
	if(!node)
	{
		//to destroy every node using recursion
		destroyTree(node->leftChild);
		destroyTree(node->rightChild);
		delete node;
		node = 0;
	}
}

void BinaryTree::createTree(istream& in)
{
	createTree(root, in);
} //end createTree in public

istream& operator>>(istream& in, BinaryTree& T)
{
	T.createTree(in);

	return in;
} //end operator>>

void BinaryTree::createTree(TreeNode* &node, istream& in)
{
	if(node != 0)
		throw TreeException("Can't overwrite existed tree!");

	char data;

	if(in >> data)
	{
		if(data != '#')
		{
			node = new TreeNode;
			node->item = data;
			node->leftChild = 0;
			node->rightChild = 0;
			createTree(node->leftChild, in);
			createTree(node->rightChild, in);
		}
	}
} //end creatTree in protected

void BinaryTree::preorderTraverse(void (BinaryTree::*visit)(TreeNode*))
{
	if(!root)
		throw TreeException("Empty tree!");

	preorder(root, visit);
} //end preorderTraverse

void BinaryTree::inorderTraverse(void (BinaryTree::*visit)(TreeNode*))
{
	if(!root)
		throw TreeException("Empty tree!");

	inorder(root, visit);
} //end inorderTraverse

void BinaryTree::postorderTraverse(void (BinaryTree::*visit)(TreeNode*))
{
	if(!root)
		throw TreeException("Empty tree!");

	postorder(root, visit);
} //end postorderTraverse

void BinaryTree::preorder(TreeNode* node, void (BinaryTree::*visit)(TreeNode* node))
{
	if(node != 0)
	{
		(this->*visit)(node);
		preorder(node->leftChild, visit);
		preorder(node->rightChild, visit);
	}
} //end preorder

void BinaryTree::inorder(TreeNode* node, void (BinaryTree::*visit)(TreeNode*))
{
	if(node != 0)
	{
		inorder(node->leftChild, visit);
		(this->*visit)(node);
		inorder(node->rightChild, visit);
	}
} //end inorder

void BinaryTree::postorder(TreeNode* node, void (BinaryTree::*visit)(TreeNode*))
{
	if(node != 0)
	{
		postorder(node->leftChild, visit);
		postorder(node->rightChild, visit);
		(this->*visit)(node);
	}
} //end postorder

void BinaryTree::levelTraverse(void (BinaryTree::*visit)(TreeNode*))
{
	if(!root)
		throw TreeException("Empty tree!");

	LinkedQueue<TreeNode*> Q;
	Q.add(root);
	TreeNode* node;

	while(!Q.isEmpty())
	{
		Q.Delete(node);
		(this->*visit)(node);
			
		if(node->leftChild != 0)
			Q.add(node->leftChild);
		
		if(node->rightChild != 0)
			Q.add(node->rightChild);
	}
} //end levelTraverse

void BinaryTree::printNode(TreeNode* node)
{
	if(!node)
		throw TreeException("Empty node!");

	cout << node->item;
} //end printNode

void BinaryTree::prePrintTree()
{
	try{
		cout << "Using recursion:";
		preorderTraverse(printNode);
		cout << "\nNot using recursion:";
		preorderTraverse2(printNode);
	} catch(TreeException& E){
		cout << E.what() << endl;
	}
} //end prePrintTree

void BinaryTree::inPrintTree()
{
	try{
		cout << "Using recursion:";
		inorderTraverse(printNode);
		cout << "\nNot using recursion:";
		inorderTraverse2(printNode);
	} catch(TreeException& E){
		cout << E.what() << endl;
	}
} //end inPrintTree

void BinaryTree::postPrintTree()
{
	try{
		cout << "Using recursion:";
		postorderTraverse(printNode);
		cout << "\nNot using recursion:";
		postorderTraverse2(printNode);
	} catch(TreeException& E){
		cout << E.what() << endl;
	}
} //end postPrintTree

void BinaryTree::levelPrintTree()
{
	try{
		levelTraverse(printNode);
	} catch(TreeException& E){
		cout << E.what() << endl;
	}
} //end levelPrintTree

void BinaryTree::preorderTraverse2(void (BinaryTree::*visit)(TreeNode*))
{
	if(!root)
		throw TreeException("Empty tree!");

	LinkedStack<TreeNode*> S;//Push treeNode to S
	TreeNode* node = root;

	while(node != 0)
	{
		(this->*visit)(node); //visit the parent first

		if(node->rightChild != 0)
			S.add(node->rightChild);
		
		if(node->leftChild != 0)
			node = node->leftChild;
		else if(S.isEmpty()) //Already visit every node
			node = 0;
		else
			S.Delete(node);
	}
} //end preorderTraverse2

void BinaryTree::inorderTraverse2(void (BinaryTree::*visit)(TreeNode*))
{
	if(!root)
		throw TreeException("Empty tree!");

	LinkedStack<TreeNode*> S;//Push treeNode to S
	TreeNode* node = root;

	while(node != 0)
	{				
		if(node->leftChild != 0)
		{
			S.add(node); //Push the parent into the stack if its leftChild exists
			node = node->leftChild; //go its leftChild to continue
		}
		else
		{
			(this->*visit)(node); //If it has no leftChild,  visit it
		
			while(node->rightChild == 0) //If it has no rightChild, pop its parent node out
			{
				if(S.isEmpty()) //Already visit every node
					break;
				else
					S.Delete(node); //node to be its parent node

				(this->*visit)(node); //visit node
			}
			
			node = node->rightChild;
		}
	}
} //end inorderTraverse2

void BinaryTree::postorderTraverse2(void (BinaryTree::*visit)(TreeNode*))
{
	if(!root)
		throw TreeException("Empty tree!");

	LinkedStack<TreeNode*> S;//Push treeNode to S
	LinkedStack<bool> popRight;//Determined the node in S is a rightChild,
							//which means its leftChild hasn't been visited
	TreeNode* node = root;

	while(node != 0)
	{
		S.add(node);
		popRight.add(false);

		if(node->rightChild != 0)
		{
			S.add(node->rightChild);
			popRight.add(true);
		}

		if(node->leftChild != 0)
			node = node->leftChild;
		else
		{
			while(!S.isEmpty())
			{
				bool temp;
				popRight.Delete(temp);
				S.Delete(node);

				if(temp)//Pop out a rightChild, so its leftChild not been visited
					break;
				else
					(this->*visit)(node);
			}
		}

		if(S.isEmpty())
			break;
	}
} //end postorderTraverse2

bool BinaryTree::findAncester(TreeNode* node, char m, char n, char& ancester)
{
	if(findM && findN) //If find both, not necessary to go on, save the run time
		return true;

	if(node == 0)
		return false;

	if(node->item == m) //Find m
	{
		if(findM)
			throw TreeException("Collision: the tree has same characters!");

		findM = true;

		if(findN) //Find both, so return
			return true;
	}
	else if(node->item == n) //Find n
	{
		if(findN)
			throw TreeException("Collision: the tree has same characters!");

		findN = true;

		if(findM)//Find both, so return
			return true;
	}

	findAncester(node->leftChild, m, n, ancester);//To find its leftChild tree

	if((findM || findN) && !setAn)//Find one and not set the ancester, so assume the node is the ancester
	{
		ancester = node->item;
		setAn = true;
	}

	findAncester(node->rightChild, m, n, ancester);//To find its rightChild tree

	if(findM && findN)//Find both, so the assume is right
		return true;
	else//The assume is wrong, so reset setAn
	{
		setAn = false;
		return false;
	}
} //end findAncester in protected, having 4 parameters

bool BinaryTree::findAncester(char m, char n, char& ancester)
{
	if(m == n)
		throw TreeException("Same characters!");

	if(!root)
		throw TreeException("Empty tree!");

	//Initialize
	findM = false;
	findN = false;
	setAn = false;

	return findAncester(root, m, n, ancester);
} //end findAncester in public

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久综合九色综合欧美就去吻 | 日韩三级精品电影久久久| 欧美mv日韩mv国产网站app| 国产精品女人毛片| 蜜臀av一区二区| 91精品福利视频| 欧美韩国一区二区| 韩国午夜理伦三级不卡影院| 欧美日本不卡视频| 一区二区三区在线免费观看| 国产精品影视在线观看| 日韩精品一区二区三区老鸭窝| 一区二区免费看| 99久久免费视频.com| 久久综合色8888| 日韩电影在线观看一区| 欧美日韩不卡在线| 亚洲精品国久久99热| 成人一道本在线| 国产亲近乱来精品视频 | 欧美va亚洲va在线观看蝴蝶网| 亚洲免费观看在线视频| 国产盗摄视频一区二区三区| 日韩欧美一区二区免费| 天堂在线亚洲视频| 欧美视频在线观看一区二区| 亚洲卡通动漫在线| 欧美影院一区二区| 亚洲成人激情社区| 欧美精品丝袜中出| 日日摸夜夜添夜夜添国产精品| 色8久久精品久久久久久蜜| 亚洲少妇最新在线视频| 99国产精品视频免费观看| |精品福利一区二区三区| fc2成人免费人成在线观看播放| 欧美韩日一区二区三区| av电影天堂一区二区在线观看| 亚洲欧美怡红院| 91免费视频大全| 亚洲一区av在线| 69p69国产精品| 久久99精品久久久久久国产越南 | 久久久久国产精品麻豆| 精品一区二区三区视频在线观看| 日韩一区二区三区四区五区六区| 日韩av电影免费观看高清完整版 | 在线不卡的av| 麻豆国产一区二区| 欧美精品一区二区三区蜜臀| 国产美女精品在线| 亚洲日本乱码在线观看| 欧美人体做爰大胆视频| 国产精品1区2区3区在线观看| 自拍av一区二区三区| 欧美日韩一级大片网址| 国产原创一区二区| 亚洲免费大片在线观看| 91精品国产综合久久久蜜臀粉嫩| 韩国av一区二区三区| 综合久久国产九一剧情麻豆| 91麻豆精品久久久久蜜臀| 国产精品一区二区在线播放| 亚洲综合精品自拍| 精品乱人伦小说| 91麻豆视频网站| 日本免费在线视频不卡一不卡二| 国产亚洲一本大道中文在线| 91在线国产福利| 日韩成人免费电影| 国产精品乱人伦| 欧美一级免费大片| 91在线小视频| 乱中年女人伦av一区二区| 亚洲视频1区2区| 精品久久久久久久久久久久包黑料| 99久久免费精品| 国产一区二区在线影院| 亚洲小说春色综合另类电影| 国产亚洲短视频| 日韩午夜三级在线| 欧美亚洲精品一区| 成人美女视频在线观看18| 免费不卡在线观看| 亚洲与欧洲av电影| 中文字幕精品一区二区三区精品| 欧美一卡在线观看| 欧美在线视频全部完| 粉嫩aⅴ一区二区三区四区 | 视频一区二区中文字幕| 欧美国产成人在线| 日韩免费视频线观看| 欧美性大战久久久| a4yy欧美一区二区三区| 国产精品综合av一区二区国产馆| 肉肉av福利一精品导航| 亚洲一区在线电影| 一区视频在线播放| 欧美激情一区二区三区不卡| 亚洲精品一区二区三区99| 日韩欧美一区在线| 欧美日韩一本到| 欧美系列在线观看| 在线精品视频免费观看| 91网页版在线| 色综合久久久久久久| 94色蜜桃网一区二区三区| 成人精品高清在线| 久久99精品久久只有精品| 另类的小说在线视频另类成人小视频在线| 亚洲午夜三级在线| 亚洲一线二线三线视频| 亚洲一区二区三区中文字幕在线| 亚洲欧美日韩综合aⅴ视频| 亚洲色图20p| 亚洲嫩草精品久久| 一区二区三区四区乱视频| 一区二区三区精品在线观看| 亚洲欧美电影院| 亚洲午夜羞羞片| 日韩精品91亚洲二区在线观看 | 成人黄色小视频| 成人动漫精品一区二区| 一本大道av伊人久久综合| 在线欧美日韩国产| 欧美日韩国产首页在线观看| 91精品国产综合久久久久久| 日韩三级伦理片妻子的秘密按摩| 久久午夜羞羞影院免费观看| 亚洲国产岛国毛片在线| 成人免费视频在线观看| 一区二区三区在线观看动漫| 五月婷婷激情综合网| 蜜乳av一区二区| 国产盗摄一区二区| 色婷婷亚洲综合| 欧美福利视频一区| 欧美浪妇xxxx高跟鞋交| 欧美久久久久久久久| 精品国精品国产| 自拍av一区二区三区| 秋霞国产午夜精品免费视频| 激情综合色综合久久综合| youjizz国产精品| 欧美日韩不卡一区二区| 2023国产精品视频| 有坂深雪av一区二区精品| 日本视频一区二区三区| 丁香婷婷综合激情五月色| 欧美午夜电影网| 欧美精品一区二区三区蜜臀| 亚洲精品国产高清久久伦理二区| 无码av免费一区二区三区试看| 国产精品自产自拍| 欧美视频一区二区三区| 久久精品欧美日韩精品 | 91精品国产欧美日韩| 久久精品一区四区| 亚洲福利视频三区| 国产精品一级在线| 欧美美女一区二区三区| 亚洲色图自拍偷拍美腿丝袜制服诱惑麻豆| 午夜激情久久久| www.成人在线| 2021国产精品久久精品| 亚洲123区在线观看| 成人黄色777网| 日韩三级视频中文字幕| 亚洲国产精品麻豆| 国产成人午夜高潮毛片| 日韩一区二区精品| 亚洲精品视频一区二区| 国产高清成人在线| 欧美一区二区三区喷汁尤物| 一区二区三区欧美亚洲| 国产宾馆实践打屁股91| 精品动漫一区二区三区在线观看| 亚洲高清视频在线| 91色九色蝌蚪| 国产精品不卡在线观看| 国产在线国偷精品产拍免费yy| 欧美一级片在线观看| 亚洲va国产天堂va久久en| 色哟哟一区二区三区| 国产精品天干天干在观线| 国产精品综合在线视频| 精品88久久久久88久久久| 日本不卡视频在线观看| 欧美日韩大陆在线| 亚洲18女电影在线观看| 欧美人体做爰大胆视频| 性久久久久久久久久久久| 欧美在线视频不卡| 亚洲国产成人porn| 欧美久久久久免费| 美国一区二区三区在线播放| 欧美变态tickle挠乳网站| 老司机精品视频一区二区三区| 欧美一级久久久久久久大片| 亚洲小说欧美激情另类|