最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

一文搞懂霍夫曼樹原理及C++/Python/Java實(shí)戰(zhàn)實(shí)現(xiàn)

 更新時(shí)間:2025年11月19日 09:17:17   作者:電搖小人  
霍夫曼樹是一種用于數(shù)據(jù)壓縮的樹形結(jié)構(gòu),通過構(gòu)建具有最小帶權(quán)路徑長度的二叉樹,實(shí)現(xiàn)高效的數(shù)據(jù)編碼,這篇文章主要介紹了霍夫曼樹原理及C++/Python/Java實(shí)戰(zhàn)實(shí)現(xiàn)的相關(guān)資料,需要的朋友可以參考下

前言

在數(shù)據(jù)壓縮、信息編碼等場景中,“如何用更少的空間存儲更多數(shù)據(jù)” 是核心需求?;舴蚵鼧洌℉uffman Tree)作為一種帶權(quán)路徑長度最小的二叉樹,正是解決這一問題的經(jīng)典數(shù)據(jù)結(jié)構(gòu) —— 基于它的霍夫曼編碼(Huffman Coding)能通過 “高頻字符短編碼、低頻字符長編碼” 的策略,大幅減少數(shù)據(jù)冗余,廣泛應(yīng)用于 ZIP 壓縮、JPEG 圖片編碼等領(lǐng)域。

本文將從霍夫曼樹的基礎(chǔ)原理出發(fā),結(jié)合 C++、Python、Java 三種主流語言的實(shí)戰(zhàn)代碼,帶你徹底掌握霍夫曼樹的構(gòu)建、編碼與應(yīng)用。

一、霍夫曼樹的核心概念

在實(shí)現(xiàn)之前,我們需要先明確幾個(gè)關(guān)鍵定義,避免后續(xù)理解混淆:

1. 霍夫曼樹的定義

霍夫曼樹又稱 “最優(yōu)二叉樹”,是指對于一組給定權(quán)重的節(jié)點(diǎn)(如字符出現(xiàn)頻率),構(gòu)建出的帶權(quán)路徑長度(WPL)最小的二叉樹。

  • 節(jié)點(diǎn)權(quán)重:節(jié)點(diǎn)的 “重要程度” 或 “出現(xiàn)頻率”(如字符 'A' 在文本中出現(xiàn) 5 次,權(quán)重即為 5)。
  • 路徑長度:從根節(jié)點(diǎn)到某一節(jié)點(diǎn)的邊數(shù)(如根節(jié)點(diǎn)到左孩子的路徑長度為 1)。
  • 帶權(quán)路徑長度(WPL):所有葉子節(jié)點(diǎn)的 “權(quán)重 × 路徑長度” 之和?;舴蚵鼧涞暮诵哪繕?biāo)就是最小化 WPL。

2. 霍夫曼編碼原理

霍夫曼樹的典型應(yīng)用是 “霍夫曼編碼”,其核心邏輯是:

  • 對霍夫曼樹的左分支標(biāo)記為 0,右分支標(biāo)記為 1;
  • 從根節(jié)點(diǎn)到每個(gè)葉子節(jié)點(diǎn)的路徑上的 0/1 序列,即為該葉子節(jié)點(diǎn)(對應(yīng)字符)的編碼;
  • 由于葉子節(jié)點(diǎn)的編碼不會是另一個(gè)葉子節(jié)點(diǎn)編碼的前綴(“前綴編碼” 特性),解碼時(shí)不會產(chǎn)生歧義。

例如:字符 'A' 的編碼是 “000”,字符 'B' 是 “001”,不會出現(xiàn) “A 的編碼是 00,B 的編碼是 001” 的情況(避免解碼時(shí)混淆)。

二、霍夫曼樹的構(gòu)建步驟

霍夫曼樹的構(gòu)建依賴 “貪心策略”—— 每次選擇權(quán)重最小的兩個(gè)節(jié)點(diǎn)合并,最終形成一棵樹。具體步驟如下:

  1. 統(tǒng)計(jì)權(quán)重:對目標(biāo)數(shù)據(jù)(如字符)統(tǒng)計(jì)每個(gè)元素的出現(xiàn)頻率(權(quán)重);
  2. 初始化最小堆:將所有節(jié)點(diǎn)(僅含權(quán)重,無左右孩子)放入最小堆(優(yōu)先隊(duì)列),確保每次能快速取出權(quán)重最小的節(jié)點(diǎn);
  3. 合并節(jié)點(diǎn)
    • 從堆中彈出兩個(gè)權(quán)重最小的節(jié)點(diǎn)(記為 A、B);
    • 新建一個(gè) “父節(jié)點(diǎn)”,其權(quán)重為 A 和 B 的權(quán)重之和;
    • 將 A 作為父節(jié)點(diǎn)的左孩子,B 作為右孩子(順序不影響 WPL,僅影響編碼);
    • 將父節(jié)點(diǎn)重新放入最小堆;
  4. 重復(fù)合并:直到堆中僅剩 1 個(gè)節(jié)點(diǎn)(即霍夫曼樹的根節(jié)點(diǎn)),構(gòu)建完成。

經(jīng)典示例驗(yàn)證

以字符頻率(權(quán)重):A(5)、B(9)、C(12)、D(13)、E(16)、F(45)為例,構(gòu)建霍夫曼樹并計(jì)算 WPL:

  • 最終 WPL = (5+9)×4 + (12+13+16)×3 + 45×1 = 14×4 + 41×3 + 45 = 56 + 123 + 45 = 224(最小可能的 WPL)。

三、多語言實(shí)戰(zhàn)實(shí)現(xiàn)

下面將通過 “構(gòu)建霍夫曼樹 + 計(jì)算 WPL + 生成霍夫曼編碼” 三個(gè)核心功能,分別用 C++、Python、Java 實(shí)現(xiàn),統(tǒng)一使用上述經(jīng)典示例的權(quán)重?cái)?shù)據(jù)。

1. C++ 實(shí)現(xiàn)

C++ 中使用priority_queue(優(yōu)先隊(duì)列)實(shí)現(xiàn)最小堆,需自定義節(jié)點(diǎn)結(jié)構(gòu)和比較規(guī)則(默認(rèn)是最大堆,需改為最小堆)。

代碼實(shí)現(xiàn):

#include <iostream>
#include <queue>
#include <unordered_map>
#include <string>
using namespace std;

// 霍夫曼樹節(jié)點(diǎn)結(jié)構(gòu)
struct HuffmanNode {
    int weight;          // 節(jié)點(diǎn)權(quán)重(字符頻率)
    char data;           // 存儲字符(非葉子節(jié)點(diǎn)可為空)
    HuffmanNode* left;   // 左孩子
    HuffmanNode* right;  // 右孩子

    // 構(gòu)造函數(shù)
    HuffmanNode(int w, char c = '\0') : weight(w), data(c), left(nullptr), right(nullptr) {}
};

// 自定義比較器:最小堆(priority_queue默認(rèn)最大堆,需反向比較)
struct CompareNode {
    bool operator()(HuffmanNode* a, HuffmanNode* b) {
        return a->weight > b->weight; // 權(quán)重小的優(yōu)先出隊(duì)
    }
};

// 構(gòu)建霍夫曼樹
HuffmanNode* buildHuffmanTree(const unordered_map<char, int>& freq) {
    // 1. 初始化最小堆,將所有字符節(jié)點(diǎn)入堆
    priority_queue<HuffmanNode*, vector<HuffmanNode*>, CompareNode> minHeap;
    for (auto& pair : freq) {
        minHeap.push(new HuffmanNode(pair.second, pair.first));
    }

    // 2. 合并節(jié)點(diǎn),直到堆中只剩1個(gè)節(jié)點(diǎn)(根節(jié)點(diǎn))
    while (minHeap.size() > 1) {
        // 取出兩個(gè)權(quán)重最小的節(jié)點(diǎn)
        HuffmanNode* left = minHeap.top();
        minHeap.pop();
        HuffmanNode* right = minHeap.top();
        minHeap.pop();

        // 合并為新節(jié)點(diǎn)(權(quán)重為兩者之和,數(shù)據(jù)設(shè)為占位符)
        HuffmanNode* parent = new HuffmanNode(left->weight + right->weight, '#');
        parent->left = left;
        parent->right = right;

        // 新節(jié)點(diǎn)入堆
        minHeap.push(parent);
    }

    // 堆中剩余節(jié)點(diǎn)即為根節(jié)點(diǎn)
    return minHeap.top();
}

// 計(jì)算霍夫曼樹的WPL(遞歸:葉子節(jié)點(diǎn)權(quán)重×路徑長度之和)
int calculateWPL(HuffmanNode* root, int depth = 0) {
    if (root == nullptr) return 0;
    // 葉子節(jié)點(diǎn)(無左右孩子):累加權(quán)重×深度
    if (root->left == nullptr && root->right == nullptr) {
        return root->weight * depth;
    }
    // 非葉子節(jié)點(diǎn):遞歸計(jì)算左右子樹WPL之和
    return calculateWPL(root->left, depth + 1) + calculateWPL(root->right, depth + 1);
}

// 生成霍夫曼編碼(遞歸:左0右1)
void generateHuffmanCode(HuffmanNode* root, string code, unordered_map<char, string>& codeMap) {
    if (root == nullptr) return;
    // 葉子節(jié)點(diǎn):記錄編碼
    if (root->data != '#') {
        codeMap[root->data] = code;
        return;
    }
    // 左分支加0,右分支加1
    generateHuffmanCode(root->left, code + "0", codeMap);
    generateHuffmanCode(root->right, code + "1", codeMap);
}

// 釋放霍夫曼樹內(nèi)存(避免內(nèi)存泄漏)
void destroyHuffmanTree(HuffmanNode* root) {
    if (root == nullptr) return;
    destroyHuffmanTree(root->left);
    destroyHuffmanTree(root->right);
    delete root;
}

int main() {
    // 示例:字符頻率(權(quán)重)
    unordered_map<char, int> freq = {
        {'A', 5}, {'B', 9}, {'C', 12}, {'D', 13}, {'E', 16}, {'F', 45}
    };

    // 1. 構(gòu)建霍夫曼樹
    HuffmanNode* root = buildHuffmanTree(freq);

    // 2. 計(jì)算WPL(預(yù)期輸出224)
    cout << "霍夫曼樹WPL:" << calculateWPL(root) << endl;

    // 3. 生成霍夫曼編碼
    unordered_map<char, string> codeMap;
    generateHuffmanCode(root, "", codeMap);
    cout << "霍夫曼編碼:" << endl;
    for (auto& pair : codeMap) {
        cout << pair.first << " : " << pair.second << endl;
    }

    // 4. 釋放內(nèi)存
    destroyHuffmanTree(root);

    return 0;
}

輸出結(jié)果

霍夫曼樹WPL:224
霍夫曼編碼:
A : 0000
B : 0001
C : 001
D : 010
E : 011
F : 1

2. Python 實(shí)現(xiàn)

Python 使用heapq模塊實(shí)現(xiàn)最小堆(heapq默認(rèn)是最小堆,無需額外配置),節(jié)點(diǎn)可用元組或自定義類,此處用元組(權(quán)重,字符,左孩子,右孩子)簡化邏輯。

代碼實(shí)現(xiàn):

import heapq

def build_huffman_tree(freq):
    """構(gòu)建霍夫曼樹:返回根節(jié)點(diǎn)(元組形式)"""
    # 1. 初始化最小堆:每個(gè)元素是(權(quán)重, 字符, 左孩子, 右孩子)
    min_heap = []
    for char, weight in freq.items():
        heapq.heappush(min_heap, (weight, char, None, None))  # 葉子節(jié)點(diǎn)無孩子

    # 2. 合并節(jié)點(diǎn)
    while len(min_heap) > 1:
        # 取出兩個(gè)最小權(quán)重節(jié)點(diǎn)
        left_weight, left_char, left_left, left_right = heapq.heappop(min_heap)
        right_weight, right_char, right_left, right_right = heapq.heappop(min_heap)

        # 合并為新節(jié)點(diǎn)(權(quán)重求和,字符用占位符'#',孩子為左右節(jié)點(diǎn))
        parent_weight = left_weight + right_weight
        parent_node = (parent_weight, '#', (left_weight, left_char, left_left, left_right), (right_weight, right_char, right_left, right_right))

        # 新節(jié)點(diǎn)入堆
        heapq.heappush(min_heap, parent_node)

    # 返回根節(jié)點(diǎn)
    return min_heap[0] if min_heap else None

def calculate_wpl(root, depth=0):
    """計(jì)算WPL:遞歸遍歷葉子節(jié)點(diǎn)"""
    if root is None:
        return 0
    weight, char, left, right = root
    # 葉子節(jié)點(diǎn)(無左右孩子)
    if left is None and right is None:
        return weight * depth
    # 非葉子節(jié)點(diǎn):遞歸左右子樹
    return calculate_wpl(left, depth + 1) + calculate_wpl(right, depth + 1)

def generate_huffman_code(root, code="", code_map=None):
    """生成霍夫曼編碼:返回{字符: 編碼}字典"""
    if code_map is None:
        code_map = {}
    if root is None:
        return code_map
    weight, char, left, right = root
    # 葉子節(jié)點(diǎn):記錄編碼
    if char != '#':
        code_map[char] = code
        return code_map
    # 左0右1遞歸
    generate_huffman_code(left, code + "0", code_map)
    generate_huffman_code(right, code + "1", code_map)
    return code_map

if __name__ == "__main__":
    # 示例:字符頻率
    freq = {'A': 5, 'B': 9, 'C': 12, 'D': 13, 'E': 16, 'F': 45}

    # 1. 構(gòu)建霍夫曼樹
    root = build_huffman_tree(freq)

    # 2. 計(jì)算WPL(預(yù)期224)
    print(f"霍夫曼樹WPL:{calculate_wpl(root)}")

    # 3. 生成編碼
    code_map = generate_huffman_code(root)
    print("霍夫曼編碼:")
    for char, code in code_map.items():
        print(f"{char} : [code]")

輸出結(jié)果

與 C++ 一致,WPL 為 224,編碼規(guī)則相同。

3. Java 實(shí)現(xiàn)

Java 使用PriorityQueue(優(yōu)先隊(duì)列)實(shí)現(xiàn)最小堆,需自定義HuffmanNode類并實(shí)現(xiàn)Comparator接口(或提供匿名比較器),確保按權(quán)重升序排序。

代碼實(shí)現(xiàn):

import java.util.*;

// 霍夫曼樹節(jié)點(diǎn)類
class HuffmanNode {
    int weight;   // 權(quán)重
    char data;    // 字符(非葉子節(jié)點(diǎn)為'#')
    HuffmanNode left;  // 左孩子
    HuffmanNode right; // 右孩子

    // 構(gòu)造函數(shù)
    public HuffmanNode(int weight, char data) {
        this.weight = weight;
        this.data = data;
        this.left = null;
        this.right = null;
    }
}

// 自定義比較器:按權(quán)重升序排序(最小堆)
class NodeComparator implements Comparator<HuffmanNode> {
    @Override
    public int compare(HuffmanNode a, HuffmanNode b) {
        return a.weight - b.weight; // 權(quán)重小的優(yōu)先
    }
}

public class HuffmanTreeDemo {
    // 構(gòu)建霍夫曼樹
    public static HuffmanNode buildHuffmanTree(Map<Character, Integer> freq) {
        // 1. 初始化最小堆
        PriorityQueue<HuffmanNode> minHeap = new PriorityQueue<>(new NodeComparator());
        for (Map.Entry<Character, Integer> entry : freq.entrySet()) {
            minHeap.add(new HuffmanNode(entry.getValue(), entry.getKey()));
        }

        // 2. 合并節(jié)點(diǎn)
        while (minHeap.size() > 1) {
            // 取出兩個(gè)最小權(quán)重節(jié)點(diǎn)
            HuffmanNode left = minHeap.poll();
            HuffmanNode right = minHeap.poll();

            // 合并為新節(jié)點(diǎn)
            HuffmanNode parent = new HuffmanNode(left.weight + right.weight, '#');
            parent.left = left;
            parent.right = right;

            // 新節(jié)點(diǎn)入堆
            minHeap.add(parent);
        }

        // 返回根節(jié)點(diǎn)
        return minHeap.peek();
    }

    // 計(jì)算WPL
    public static int calculateWPL(HuffmanNode root, int depth) {
        if (root == null) return 0;
        // 葉子節(jié)點(diǎn)
        if (root.left == null && root.right == null) {
            return root.weight * depth;
        }
        // 遞歸左右子樹
        return calculateWPL(root.left, depth + 1) + calculateWPL(root.right, depth + 1);
    }

    // 生成霍夫曼編碼
    public static void generateHuffmanCode(HuffmanNode root, String code, Map<Character, String> codeMap) {
        if (root == null) return;
        // 葉子節(jié)點(diǎn)
        if (root.data != '#') {
            codeMap.put(root.data, code);
            return;
        }
        // 左0右1
        generateHuffmanCode(root.left, code + "0", codeMap);
        generateHuffmanCode(root.right, code + "1", codeMap);
    }

    public static void main(String[] args) {
        // 示例:字符頻率
        Map<Character, Integer> freq = new HashMap<>();
        freq.put('A', 5);
        freq.put('B', 9);
        freq.put('C', 12);
        freq.put('D', 13);
        freq.put('E', 16);
        freq.put('F', 45);

        // 1. 構(gòu)建霍夫曼樹
        HuffmanNode root = buildHuffmanTree(freq);

        // 2. 計(jì)算WPL(預(yù)期224)
        System.out.println("霍夫曼樹WPL:" + calculateWPL(root, 0));

        // 3. 生成編碼
        Map<Character, String> codeMap = new HashMap<>();
        generateHuffmanCode(root, "", codeMap);
        System.out.println("霍夫曼編碼:");
        for (Map.Entry<Character, String> entry : codeMap.entrySet()) {
            System.out.println(entry.getKey() + " : " + entry.getValue());
        }
    }
}

輸出結(jié)果

同樣得到 WPL=224,編碼規(guī)則與前兩種語言一致。

四、常見問題與注意事項(xiàng)

  1. 單節(jié)點(diǎn)場景處理:若僅需編碼 1 個(gè)字符(如所有數(shù)據(jù)都是 'A'),此時(shí)堆中只有 1 個(gè)節(jié)點(diǎn),無需合并,直接編碼為 “0” 或空串即可(需特殊判斷,避免循環(huán)不執(zhí)行)。
  2. 最小堆的正確性:三種語言的堆默認(rèn)行為不同(C++ 默認(rèn)最大堆、Python/Java 默認(rèn)最小堆),需確保自定義比較規(guī)則正確,否則會導(dǎo)致合并順序錯(cuò)誤,WPL 偏大。
  3. 內(nèi)存管理:C++ 需手動釋放節(jié)點(diǎn)內(nèi)存(避免內(nèi)存泄漏),Python/Java 依賴?yán)厥眨瑹o需額外處理。
  4. 編碼唯一性:霍夫曼編碼不唯一(合并時(shí)左右節(jié)點(diǎn)順序可互換),但 WPL 始終最小,不影響壓縮效率。

五、應(yīng)用場景與總結(jié)

霍夫曼樹的核心價(jià)值在于 “最優(yōu)編碼”,其典型應(yīng)用包括:

  • 數(shù)據(jù)壓縮:ZIP、GZIP、JPEG 等格式均使用霍夫曼編碼減少存儲體積;
  • 信息傳輸:減少傳輸帶寬,提高通信效率;
  • 頻率統(tǒng)計(jì):如日志分析中高頻事件的快速標(biāo)記。

三種語言實(shí)現(xiàn)對比:

  • C++:效率最高,適合高性能場景,但需手動管理內(nèi)存和自定義堆比較規(guī)則;
  • Python:代碼最簡潔,heapq模塊易用,適合快速開發(fā)和小規(guī)模數(shù)據(jù);
  • Java:跨平臺性好,PriorityQueue需自定義比較器,適合企業(yè)級應(yīng)用。

掌握霍夫曼樹的構(gòu)建與編碼,不僅能理解數(shù)據(jù)壓縮的底層邏輯,更能鍛煉 “貪心算法” 的思維 —— 在有限資源下,每次選擇局部最優(yōu)解,最終得到全局最優(yōu)解。

到此這篇關(guān)于一文搞懂霍夫曼樹原理及C++/Python/Java實(shí)戰(zhàn)實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)C++/Python/Java實(shí)現(xiàn)霍夫曼樹內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 關(guān)于python pyqt5安裝失敗問題的解決方法

    關(guān)于python pyqt5安裝失敗問題的解決方法

    這篇文章主要給大家介紹了關(guān)于python pyqt5安裝失敗問題的解決方法,文中給出了詳細(xì)的解決過程與解決方法,對同樣遇到這個(gè)問題的朋友們具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們跟著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-08-08
  • Python函數(shù)式編程指南(二):從函數(shù)開始

    Python函數(shù)式編程指南(二):從函數(shù)開始

    這篇文章主要介紹了Python函數(shù)式編程指南(二):從函數(shù)開始,本文講解了定義一個(gè)函數(shù)、使用函數(shù)賦值、閉包、作為參數(shù)等內(nèi)容,需要的朋友可以參考下
    2015-06-06
  • Python numpy 點(diǎn)數(shù)組去重的實(shí)例

    Python numpy 點(diǎn)數(shù)組去重的實(shí)例

    下面小編就為大家分享一篇Python numpy 點(diǎn)數(shù)組去重的實(shí)例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-04-04
  • pip版本低導(dǎo)致Python離線包安裝失敗的問題解決

    pip版本低導(dǎo)致Python離線包安裝失敗的問題解決

    在使用Python進(jìn)行開發(fā)時(shí),安裝各種第三方庫是必不可少的,不過,有時(shí)候我們會遇到一些麻煩,尤其是當(dāng)pip的版本較低時(shí),下面我們來看看如何解決這一問題吧
    2025-03-03
  • Python中文糾錯(cuò)的簡單實(shí)現(xiàn)

    Python中文糾錯(cuò)的簡單實(shí)現(xiàn)

    這篇文章主要是用 Python 實(shí)現(xiàn)了簡單的中文分詞的同音字糾錯(cuò),目前的案例中只允許錯(cuò)一個(gè)字,感興趣的小伙伴們可以參考一下
    2021-07-07
  • 詳解如何利用Python代碼刪除Word文檔空白行

    詳解如何利用Python代碼刪除Word文檔空白行

    Word文檔內(nèi)容的整潔性與易讀性是體現(xiàn)文檔水平的關(guān)鍵因素之一,許多錯(cuò)誤或不合理的內(nèi)容,如多余的空白行,Python為批量刪除Word文檔空白行以及對這一過程的自動化處理提供了強(qiáng)有力的支持,本文將介紹如何利用Python自動化刪除Word文檔中的空白行,需要的朋友可以參考下
    2024-05-05
  • Python的pycurl包用法簡介

    Python的pycurl包用法簡介

    這篇文章主要介紹了Python的pycurl包用法簡介,文中羅列了其下模塊中的一些常用方法,需要的朋友可以參考下
    2015-11-11
  • Python實(shí)現(xiàn)實(shí)時(shí)顯示進(jìn)度條的6種方法

    Python實(shí)現(xiàn)實(shí)時(shí)顯示進(jìn)度條的6種方法

    相信大家對進(jìn)度條一定不陌生了,很多安裝或者下載都會出現(xiàn)進(jìn)度條,本文主要介紹了Python實(shí)現(xiàn)實(shí)時(shí)顯示進(jìn)度條的6種方法,具有一定的參考價(jià)值,感興趣的可以了解一下
    2021-12-12
  • Ubuntu安裝Jupyter Notebook教程

    Ubuntu安裝Jupyter Notebook教程

    這篇文章主要為大家詳細(xì)介紹了Ubuntu安裝Jupyter Notebook教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-10-10
  • Python 獲取ftp服務(wù)器文件時(shí)間的方法

    Python 獲取ftp服務(wù)器文件時(shí)間的方法

    今天小編就為大家分享一篇Python 獲取ftp服務(wù)器文件時(shí)間的方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-07-07

最新評論

阳西县| 长子县| 腾冲县| 巴楚县| 同心县| 宁波市| 兰坪| 鹿邑县| 保德县| 阳东县| 娄烦县| 昌乐县| 盐源县| 加查县| 云梦县| 蓝山县| 信宜市| 浦北县| 武夷山市| 读书| 玉田县| 敦煌市| 平舆县| 苍山县| 施甸县| 井冈山市| 东宁县| 高碑店市| 沙田区| 卢湾区| 许昌县| 金沙县| 大英县| 富宁县| 明星| 浙江省| 罗定市| 积石山| 亳州市| 乐平市| 察雅县|