欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

二叉樹基礎

二叉樹:二叉樹是一棵特殊的樹,二叉樹每個節(jié)點最多有兩個孩子結點,分別稱為左孩子和右孩子。

讓客戶滿意是我們工作的目標,不斷超越客戶的期望值來自于我們對這個行業(yè)的熱愛。我們立志把好的技術通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領域值得信任、有價值的長期合作伙伴,公司提供的服務項目有:申請域名、網頁空間、營銷軟件、網站建設、廉江網站維護、網站推廣。

二叉樹節(jié)點結構:

        二叉樹基礎

struct BinaryTreeNode
{
	T _data;			//數據
	BinaryTreeNode<T>* _left;	//指向左子樹
	BinaryTreeNode<T>* _right;	//指向右子樹
	
	BinaryTreeNode(const T& d)
		:_data(d)
		,_left(NULL)
		,_right(NULL)
	{}
};

二叉樹的創(chuàng)建:

Node* _CreateTree(const T* a, size_t size, size_t& index, const T& invilid)
{
	Node* root = NULL;
	if(index<size && a[index] != invilid)
	{
		root = new Node(a[index]);		                //創(chuàng)建根節(jié)點
		root->_left = _CreateTree(a, size, ++index, invilid);	//遞歸實現左子樹
		root->_right = _CreateTree(a, size, ++index, invilid);	//遞歸實現右子樹
	}
	return root;	//返回根節(jié)點
}

前序遍歷:

/* 前序遍歷:根->左子樹->右子樹 */
void _PrevOrder(Node* root)
{
	if(root == NULL)
	{
		return;
	}
	cout<<root->_data<<" ";		//打印根節(jié)點數據
	_PrevOrder(root->_left);	//遞歸遍歷左子樹
	_PrevOrder(root->_right);	//遞歸遍歷右子樹
}

中序遍歷:

/* 中序遍歷:左子樹->根->右子樹 */
void _InOrder(Node* root)
{
	if(root == NULL)
	{
		return;
	}
	_InOrder(root->_left);		//遞歸遍歷左子樹
	cout<<root->_data<<" ";		//打印根節(jié)點數據
	_InOrder(root->_right);		//遞歸遍歷右子樹
}

后序遍歷:

/* 后序遍歷:左子樹->右子樹->根 */
void _PostOrder(Node* root)
{
	if(root == NULL)
	{
		return;
	}
	_PostOrder(root->_left);	//遞歸遍歷左子樹
	_PostOrder(root->_right);	//遞歸遍歷右子樹
	cout<<root->_data<<" ";		//打印根節(jié)點數據
}

層次遍歷:

/* 層次遍歷:第一層->最后一層 */
void _LevelOrder(Node* root)
{
	queue<Node*> qt;
	
	if(root == NULL)
	{
	        return;
	}
	
	qt.push(root);        //將根節(jié)點壓到隊列中
	
	while(!qt.empty())
	{
	        /* 當根節(jié)點的左孩子不為空,就說明這一層還沒有完全壓入隊列中 */
	        if(qt.front()->_left != NULL)
		{
			qt.push(qt.front()->_left);    //將根節(jié)點左子樹壓到隊列中
		}
		/* 當根節(jié)點的右孩子不為空,就說明這一層還沒有完全壓入隊列中 */
		if(qt.front()->_right != NULL)
		{
			qt.push(qt.front()->_right);   //將根節(jié)點右子樹壓到隊列中
		}
		
		cout<<qt.front()->_data<<" ";    //依次打印節(jié)點
		
		qt.pop();       //將打印的節(jié)點出隊列
	}
}

二叉樹節(jié)點的個數 = 就是左子樹節(jié)點個數加上右子樹節(jié)點的個數再加上根節(jié)點

size_t _Size(Node* root)
{
	if(root == NULL)
	{
		return 0;
	}
	return _Size(root->_left)+_Size(root->_right)+1;//左子樹節(jié)點+右子樹節(jié)點+根節(jié)點
}

二叉樹的深度 = 左子樹 >= 右子樹 ? 左子樹+1, 右子樹+1;

size_t _Depth(Node* root)
{
	if(root == NULL)
	{
		return 0;
	}
	size_t LeftDepth = _Depth(root->_left);
	size_t RightDepth = _Depth(root->_right);
	if(LeftDepth >= RightDepth)
	{
		return LeftDepth+1;
	}
	else
	{
		return RightDepth+1;
	}
}

二叉樹葉子節(jié)點的個數 = 左子樹的葉子節(jié)點 個數+ 右子樹的葉子節(jié)點個數

size_t _LeafSize(Node* root)
{
	if(root == NULL)
	{
		return 0;
	}
	if(root->_left == NULL && root->_right == NULL)    //只有根節(jié)點
	{
		return 1;
	}
	return _LeafSize(root->_left)+_LeafSize(root->_right);
}

整體代碼:

#include <iostream>
#include <queue>
using namespace std;

template <class T>

struct BinaryTreeNode
{
	T _data;			//數據域
	BinaryTreeNode<T>* _left;	//指向左子樹
	BinaryTreeNode<T>* _right;	//指向右子樹
	
	BinaryTreeNode(const T& d)
		:_data(d)
		,_left(NULL)
		,_right(NULL)
	{}
};

template<class T>

class BinaryTree
{
	typedef BinaryTreeNode<T> Node; //類型重命名,方便后面使用
public:
	BinaryTree()
		:_root(NULL)
	{}
	BinaryTree(const T* a, size_t size, const T& invilid)
		:_root(NULL)
	{
		size_t index = 0;
		_root = _CreateTree(a, size, index, invilid);
	}
	BinaryTree<T>(const BinaryTree& tree)
	{
		_root = _Copy(tree._root);
	}
	BinaryTree& operator= (BinaryTree tree)    //現代式寫法
	{
		swap(_root, tree._root);
		return *this;
	}
	~BinaryTree()
	{
		if(_root != NULL)
		{
			_Destroy(_root);
		}
	}
public:
	void PrevOrder()
	{
		_PrevOrder(_root);
		cout<<endl;
	}
	void InOrder()
	{
		_InOrder(_root);
		cout<<endl;
	}
	void PostOrder()
	{
		_PostOrder(_root);
		cout<<endl;
	}
	void LevelOrder()
	{
		_LevelOrder(_root);
		cout<<endl;
	}
	size_t Size()
	{
		return _Size(_root);
	}
	size_t Depth()
	{
		return _Depth(_root);
	}
	size_t LeafSize()
	{
		return _LeafSize(_root);
	}
protected:
	size_t _Size(Node* root)
	{
		if(root == NULL)
		{
			return 0;
		}
		/* 左子樹節(jié)點+右子樹節(jié)點+根節(jié)點 */
		return _Size(root->_left)+_Size(root->_right)+1;
	}
	size_t _Depth(Node* root)
	{
		if(root == NULL)
		{
			return 0;
		}
		size_t LeftDepth = _Depth(root->_left);
		size_t RightDepth = _Depth(root->_right);
		if(LeftDepth >= RightDepth)
		{
			return LeftDepth+1;
		}
		else
		{
			return RightDepth+1;
		}
	}
	size_t _LeafSize(Node* root)
	{
		if(root == NULL)
		{
			return 0;
		}
		if(root->_left == NULL && root->_right == NULL)
		{
			return 1;
		}
		return _LeafSize(root->_left)+_LeafSize(root->_right);
	}
protected:
	/* 前序遍歷:根->左子樹->右子樹 */
	void _PrevOrder(Node* root)
	{
		if(root == NULL)
		{
			return;
		}
		cout<<root->_data<<" ";		//打印根節(jié)點數據
		_PrevOrder(root->_left);	//遞歸遍歷左子樹
		_PrevOrder(root->_right);	//遞歸遍歷右子樹
	}
	/* 中序遍歷:左子樹->根->右子樹 */
	void _InOrder(Node* root)
	{
		if(root == NULL)
		{
			return;
		}
		_InOrder(root->_left);		//遞歸遍歷左子樹
		cout<<root->_data<<" ";		//打印根節(jié)點數據
		_InOrder(root->_right);		//遞歸遍歷右子樹
	}
	/* 后序遍歷:左子樹->右子樹->根 */
	void _PostOrder(Node* root)
	{
		if(root == NULL)
		{
			return;
		}
		_PostOrder(root->_left);	//遞歸遍歷左子樹
		_PostOrder(root->_right);	//遞歸遍歷右子樹
		cout<<root->_data<<" ";		//打印根節(jié)點數據
	}
	/* 層次遍歷:第一層->最后一層 */
	void _LevelOrder(Node* root)
	{
		queue<Node*> qt;
		if(root == NULL)
		{
			return;
		}
		qt.push(root);
		while(!qt.empty())
		{
			if(qt.front()->_left != NULL)
			{
				qt.push(qt.front()->_left);
			}
			if(qt.front()->_right != NULL)
			{
				qt.push(qt.front()->_right);
			}
			cout<<qt.front()->_data<<" ";
			qt.pop();
		}
	}
protected:
	Node* _Copy(Node* root)
	{
		if(root == NULL)
		{
			return NULL;
		}
		Node* NewRoot = new Node(root->_data);	//創(chuàng)建新的根節(jié)點
		Node* NewCur = NewRoot;
		NewCur->_left = _Copy(root->_left);
		NewCur->_right = _Copy(root->_right);
		return NewRoot;
	}
	void _Destroy(Node* root)
	{
		if(root == NULL)
		{
			return;
		}
		if(root->_left == NULL && root->_right == NULL)
		{
			delete root;
			root = NULL;
			return;
		}
		_Destroy(root->_left);
		_Destroy(root->_right);
	}
	Node* _CreateTree(const T* a, size_t size, size_t& index, const T& invilid)
	{
		Node* root = NULL;
		if(index<size && a[index] != invilid)
		{
		    root = new Node(a[index]);		//創(chuàng)建根節(jié)點
		    root->_left = _CreateTree(a, size, ++index, invilid);//遞歸實現左子樹
		    root->_right = _CreateTree(a, size, ++index, invilid);//遞歸實現右子樹
		}
		return root;	//返回根節(jié)點
	}
protected:
	Node* _root;    //根節(jié)點
};

int main()
{
	Test();
	system("pause");
	return 0;
}

測試結構:

二叉樹基礎

測試代碼:

void Test()
{
	int array[10] = {1, 2, 3, '#', '#', 4, '#' , '#', 5, 6};
	BinaryTree<int> tree(array, 10, '#');
	tree.PrevOrder();
	tree.InOrder();
	tree.PostOrder();
	tree.LevelOrder();	
	BinaryTree<int> tree2(tree);
	tree2.PrevOrder();
	BinaryTree<int> tree3 = tree2;
	tree3.PrevOrder();
}

測試結果:

二叉樹基礎

文章題目:二叉樹基礎
文章來源:http://aaarwkj.com/article46/gpieeg.html

成都網站建設公司_創(chuàng)新互聯,為您提供關鍵詞優(yōu)化、虛擬主機、網站營銷、品牌網站建設、ChatGPT、自適應網站

廣告

聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯

綿陽服務器托管
中文字幕日韩人妻av| 蜜桃精品人妻一区二区三区| 热门精品一区二区三区| 最新日韩人妻中文字幕一区| 国产偷自一区二区三区| 中文字幕三级电影天堂| 欧美一区二区三区四区久久| 激情偷拍一区二区三区视频| 老湿机午夜十分钟视频| 国产精品黑丝美女91| 亚洲国产精品自拍第一页| 国产黄色三级电影在线| 日日躁夜夜躁久久狠狠躁| 久久亚洲女同第一区综合| 白白色成人永久在线观看视频| 成人性生交大片免费看中文 | 大胸妇女引诱老师在线观看| 亚洲人色中文字幕天堂| 国产成人亚洲精品乱码| 国产精品一区巨乳人妻| 97视频在线观看网站| 久久国产精品乱码电影| 日韩在线免费色视频| 亚洲熟女午夜毛片av毛片| 亚洲中文字幕视频在看| 亚洲日本一区二区一本一道| 日韩亚洲欧美国产另类| 日本 午夜 在线 视频| 97在线观看免费公开| 亚洲国产综合六月深深爱| 亚洲91无专砖码高清观看| 97碰碰视频在线观看| 国产一区二区高清不卡| 中文字幕日韩手机在线| 日本岛国一区二区在线| 黑人精品一区二区三区| 精品国产乱码久久蜜桃| 国产成人精品福利一区二区| 中文字幕日本乱码精品久久| 热热久久这里只有精品| 国产女片xb内射在线|