芙门泡芙 2023-03-13 12:21 采纳率: 50%
浏览 11

用优先队列求哈夫曼树的权值和,出现指针改变问题

为什么这个优先队列会改变我的树节点的left和right指针值?

img

哈夫曼树,第一行输入一个数n,表示叶结点的个数。需要用这些叶结点生成哈夫曼树,根据哈夫曼树的概念,这些结点有权值,即weight,题目需要输出所有结点的值与权值的乘积之和。

输入有多组数据。
每组第一行输入一个数n,接着输入n个叶节点(叶节点权值不超过100,2<=n<=1000)。
输出权值。

输入样例#:
5
1 2 2 5 9

输出
37

//
//  哈夫曼树.cpp
//  计算机复试
//
//  Created by owenjiang on 2023/3/13.
//
#include<iostream>
#include<queue>
using namespace std ;
typedef struct Node{
    int value ;
    Node *left, *right ;
} *Node2;
bool operator < ( Node node1,Node node2){
    return node1.value > node2.value ;
}
Node* createNode(int val){
    Node *node = new Node() ;
    node->left = NULL ;
    node->right = NULL ;
    node->value = val ;
    return node ;
}
void caculate(Node *root,int height,int &result){
    if (root->left == NULL && root->right == NULL) {
        result += height * root->value ;
        return ;
    }
    caculate(root->left, height+1, result) ;
    caculate(root->right, height+1, result) ;
}
int createHalfManTree(priority_queue<Node> &nodesValue){
    while (nodesValue.size() > 1 ){
        Node *newNode = new Node() ;
        Node topOne = nodesValue.top() ;
        nodesValue.pop() ;
        Node topTwo = nodesValue.top() ;
        nodesValue.pop() ;
        newNode->value = topOne.value + topTwo.value ;
        newNode->left = &topOne ;
        newNode->right = &topTwo ;
        nodesValue.push(*newNode) ;
    }
    Node root = nodesValue.top() ;
    int result = 0 ;
    caculate(&root,0,result) ;
    return result ;
}
int main(){
    int nodes;
    while (cin >> nodes){
        priority_queue<Node> heap ;
        int temp ;
        for (int i=0;i<nodes;i++){
            cin >> temp ;
            heap.push(*createNode(temp)) ;
        }
        int weight = createHalfManTree(heap) ;
        cout << weight << endl ;
    }
    return 0 ;
}


```

  • 写回答

2条回答 默认 最新

报告相同问题?

问题事件

  • 创建了问题 3月13日

悬赏问题

  • ¥100 对接美团闪购医药接口相关问题
  • ¥15 嵌入式软件电子烟开发
  • ¥15 职场 Excel 查重问题
  • ¥20 multisim方波发生电路产生的波形异常,学校没讲模电就留了实验qwq
  • ¥15 求怎么用idea2021.3.2创建web项目并配置tomcat
  • ¥100 or-tools的相关问题
  • ¥15 有可能用平板通过拓展坞来烧录程序吗(keil5的那种)
  • ¥15 状态图的并发态问题咨询
  • ¥15 PFC3D,plot
  • ¥15 VAE模型编程报错无法解决