二叉樹和其他樹
阿新 • • 發佈:2021-02-17
技術標籤:資料結構與演算法應用C++二叉樹c++
樹
一棵樹t是一個非空的有限元素的集合,其中一個元素為根,其餘的元素(如果有的話)組成t的子樹,數根是1級,孩子是2級,一個樹的高度或深度為數樹中級的個數。一個元素的度是指其孩子的個數。葉節點的度為0,一棵樹的度是指其元素度的最大值。
二叉樹
一棵二叉樹是t個有限元素的集合,當二叉樹為空時,其中有一個元素稱為根,餘下的元素被劃分成兩科二叉樹,分別稱為t的左子樹和右子樹。
二叉樹和樹的根本區別是:
- 二叉樹的每個元素都恰好有兩棵子樹(其中一個或兩個可能為空)。而樹的每個元素可有任意數量的子樹。
- 在二叉樹中,每個元素都是有序的,也就是說,有左子樹和右子樹之分。而樹的子樹是無序的。
二叉樹的特性
- 二叉樹有n個元素,n>0,他有n-1條邊。
- 一棵二叉樹的高度為h,h≥0,它最少有h個元素,最多有 2 h − 1 2^h-1 2h−1個元素
- 一棵二叉樹有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 2h−1個元素時,稱其為滿二叉樹,對高度為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)
應用
設定訊號放大器
在一個分散式網路中,資源從生產地送往其他地方。用術語訊號來指稱輸送的資。訊號在網路中傳輸時,它在某一方面或某幾個方面的效能可能會損失或衰減,為了保證訊號衰減不超過容忍值,應在網路中至關重要的位置上放置訊號放大器。訊號放大器可以增加訊號的壓強或電壓使其餘源點相同;可以增強訊號,使訊號與噪聲之比與源點的相同。目標是,放大器的數目最少,同時保證訊號衰減(與源點相關)不超過給定的容忍值。