zoukankan      html  css  js  c++  java
  • 哈夫曼树的构建算法之找出两个最小的子树的下标

    struct Node
    {
        int weight;
        int parent;
        int lChild;
        int rChild;
    };
    
    typedef struct Node NODE;
    
    typedef NODE *HuffmanTree;
    
    
    
    int selector(HuffmanTree HT, int n)
    {
        int min = -1;
        bool first = true;
    
        for (int i = 1; i <= n; i++)
        {
            if (HT[i].parent == 0)
            {
                if (first)      // 只有在 min 即将第一次被赋值的时候,才会进入
                {
                    min = i;
                    first = false;
                }
                else {          // min 已经被赋值过了,进入这个分支
                    if (HT[i].weight < HT[min].weight)
                    {
                        min = i;
                    }
                }
            }
        }
        
        return min;
    }
    
    // 从没有选过的树里面,选择两个weight最小的。把他们的下标放在 s1和s2所在的空间
    bool select(HuffmanTree HT, int *s1, int *s2, int n)
    {
        int min = selector(HT, n);
        if (min == -1)
            return false;
    
        HT[min].parent = -1;     // 设置一个值,临时地表示这个节点已经被选中了
    
        int subMin = selector(HT, n);
    
        if (subMin == -1)
            return false;
    
        HT[min].parent = 0;     // 恢复未被选中的状态
    
        *s1 = min;      // 左边的比较小
        *s2 = subMin;   // 右边的大一点
        return true;
    }
    
    
  • 相关阅读:
    20165312 我期望的师生关系
    zookeeper04---ZAB协议
    zookeeper03-集群搭建
    zookeeper02
    Zookeeper01
    防止重复提交
    手动抛出异常事务回滚问题
    redis-07主从复制
    redis06-事务
    Redis-05持久化
  • 原文地址:https://www.cnblogs.com/Blithe-Chiang/p/13832895.html
Copyright © 2011-2022 走看看