1. 程式人生 > 其它 >二叉樹和其他樹

二叉樹和其他樹

技術標籤:資料結構與演算法應用C++二叉樹c++

一棵樹t是一個非空的有限元素的集合,其中一個元素為,其餘的元素(如果有的話)組成t的子樹,數根是1級,孩子是2級,一個樹的高度或深度為數樹中級的個數。一個元素的是指其孩子的個數。葉節點的度為0,一棵樹的度是指其元素度的最大值。

二叉樹

一棵二叉樹是t個有限元素的集合,當二叉樹為空時,其中有一個元素稱為,餘下的元素被劃分成兩科二叉樹,分別稱為t的左子樹和右子樹。
二叉樹和樹的根本區別是:

  • 二叉樹的每個元素都恰好有兩棵子樹(其中一個或兩個可能為空)。而樹的每個元素可有任意數量的子樹。
  • 在二叉樹中,每個元素都是有序的,也就是說,有左子樹和右子樹之分。而樹的子樹是無序的。

二叉樹的特性

  1. 二叉樹有n個元素,n>0,他有n-1條邊。
  2. 一棵二叉樹的高度為h,h≥0,它最少有h個元素,最多有 2 h − 1 2^h-1 2h1個元素
  3. 一棵二叉樹有n個元素,n>0,它的高度最大為h,最小高度為 ⌈ l o g 2 ( n + 1 ) ⌉ \lceil log_2(n+1) \rceil log2(n+1)
    高度為h的二叉樹恰好有 2 h − 1 2^h-1 2h1個元素時,稱其為滿二叉樹,對高度為h的滿二叉樹元素,從第一層到最後一層,在每一層中從左到右,順序編號,按順序排列的前k個是完全二叉樹

二叉樹的描述

二叉樹可以用陣列描述,但此時浪費空間最大。
用連結串列描述時,節點有兩個指標域分別是leftChild和rightChild,還有一個數據域是element。

template <class T>
struct binaryTreeNode
{
	T element;
	binaryTreeNode<T> *leftChild, //左子樹
					  *rightChild;//右子樹
	binaryTreeNode(){leftChild = rightChild = NULL;}
	binaryTreeNode(const T& theElement)
	{
		element(theElement)
		leftChild = rightChild = NULL;
	}
	binaryTreeNode(const T&
theElement, binaryTreeNode *theLeftChild, binaryTreeNode *theRightChild) { element(theElement) leftChild = theLeftChild; rightChild = theRigthChild; } };

在這裡插入圖片描述

二叉樹的遍歷

  • 前序遍歷
  • 中序遍歷
  • 後序遍歷
  • 逐層遍歷

前序遍歷:根->左子樹->右子樹

template<class T>
void preOrder(binaryTreeNode<T> *t)
{//前序遍歷二叉樹*t
	if(t != NULL)
	{
		visit(t);			   //訪問樹根
		preOrder(t->leftChild);//前序遍歷左子樹
		preOrder(t->rightChild);//前序遍歷右子樹
	}
}

中序遍歷:左子樹->根->右子樹

template<class T>
void inOrder(binaryTreeNode<T> *T)
{
	if(t != NULL)
	{
		inOrder(t->leftChild);//中序遍歷左子樹
		visit(t);	//訪問樹根
		inOrder(t->rightChild);//中序遍歷右子樹
	}
}

後序遍歷:左子樹->右子樹->根

template<class T>
void postOrder(binaryTreeNode<T> *t)
{
	if(t != NULL)
	{
		postOrder(t->leftChild);//後序遍歷左子樹
		postOrder(t->rightChild);//後序遍歷右子樹
		visit(t);//訪問樹根
	}
}

層次遍歷

template<class T>
void levelOrder(binaryTreeNode<T> *t)
{
	arrayQueue<binaryTreeNode<T>*> q;
	while(t != NULL)
	{
		visit(t);			//訪問t
		//將t的孩子插入佇列
		if(t->leftChild != NULL)
			q.push(t->leftChild);
		if(t->rightChild != NULL)
			q.push(t->rightChild);
		//提取下一個要訪問的節點
		try(t = q.front();)
		cathch(queueEmpty){return;)
		q.pop();
	}
}

一棵二叉樹有n個元素,四種演算法空間和時間複雜性均為 O ( n ) O(n) O(n)

應用

設定訊號放大器

在一個分散式網路中,資源從生產地送往其他地方。用術語訊號來指稱輸送的資。訊號在網路中傳輸時,它在某一方面或某幾個方面的效能可能會損失或衰減,為了保證訊號衰減不超過容忍值,應在網路中至關重要的位置上放置訊號放大器。訊號放大器可以增加訊號的壓強或電壓使其餘源點相同;可以增強訊號,使訊號與噪聲之比與源點的相同。目標是,放大器的數目最少,同時保證訊號衰減(與源點相關)不超過給定的容忍值。