树、最短路径、哈夫曼树

一、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)——对于稠密图效果好点

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值