一、Tree Traversals Again
二、完全二叉搜索树
什么是二叉搜索树?
左子树<根结点<右子树。什么是完全二叉树?
完美二叉树的子部分
树的表示方法?
链表、数组(不涉及指针操作,但可能空间浪费比较严重)
题目:给定一串数列,将它以完全二叉搜索树的层序遍历方式输出。
核心算法:
void solve (int ALeft , int ARight , int TRoot)
{
n = ARight - ALeft + 1;
if (n==0) return;
L = GetLeftLength(n); //得到结点树为n的树其左子树结点的个数
T[TRoot] = A[Aleft+L];
LeftTRoot = TRoot*2+1;
RightTRoot = LeftTRoot+1;
solve(ALeft,ALeft+L-1,LeftTRoot);
solve(ALeft+L+1,ARight,RightTRoot);
}
一个排序算法
计算左子树的规模
三、Huffman Codes(最优编码)
最优编码不一定要通过哈夫曼算法得到!!!
哈夫曼编码的特点
1、最优编码——最长度(WPL)最小
2、无歧义编码——前缀码:数据仅存在于叶子结点
3、没有度为1的结点——满足1、2则必然有3.
哈夫曼树的构造:每次把权值最小的两棵二叉树合并
MinHeap H = CreateHeap(N);创建一个空的、容量为N的最小堆
H = ReadData(N); 将f[]读入H—>Data[]中
HuffmanTree T = Huffman (H); //建立Huffman树
int CodeLen = WPL( T , 0);
int WPL(HuffmanTree T , int Depth)
{ if( !T->Left && !T->Right)
return (Depth * T->Weight);
else //负责T一定有两个孩子
return (WPL(T->Left , Depth-1)+WPL(T->Right , Depth));
}
四、最短路径问题
最短问题的抽象:
在网络中,求两个不同顶点之间的所有路径中,边的权值之和最小的那一条路径。
(一)无权图的单源最短路径算法
void Unweighted( Vertex S)
{ Enqueue( S,Q);
while( !IsEmpty(Q)){
V = Dequeue(Q);
for(V的每一个邻接点W){
if( dist[W] == -1){
dist[W] = dist[V] + 1;
path[W] = v;
Enqueue(W , Q);
}
}
}
}
(二)有权图的单源最短路径
Dijkstra算法
(三)多源最短路算法
方法一:直接将单源最短路算法调用|V|遍,T = O(|V|^3+|E|*|V|)——对于稀疏图效果好。
方法二:Floyd算法 T = O(|V|^3)——对于稠密图效果好点