树
一棵树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)
应用
设置信号放大器
在一个分布式网络中,资源从生产地送往其他地方。用术语信号来指称输送的资。信号在网络中传输时,它在某一方面或某几个方面的性能可能会损失或衰减,为了保证信号衰减不超过容忍值,应在网络中至关重要的位置上放置信号放大器。信号放大器可以增加信号的压强或电压使其余源点相同;可以增强信号,使信号与噪声之比与源点的相同。目标是,放大器的数目最少,同时保证信号衰减(与源点相关)不超过给定的容忍值。