芙门泡芙 2023-03-26 21:49 采纳率: 50%
浏览 12
已结题

如下构建哈夫曼树并求总权值的方法哪里有错误?为什么我得到的树是错误的?


#include<iostream>
#include<queue>
#include<vector>
using namespace std ;
struct Node{
    Node *left, *right ;
    int value ;
    Node(int val){
        value = val ;
        left = NULL ;
        right = NULL ;
    }
    bool operator <(const Node &v2) const{
        return value > v2.value ;
    }
} ;

void caculateHeight(Node root,int h,int &sum){
    if (root.left == NULL && root.right == NULL){
        sum += root.value * h ;
        return ;
    }
    caculateHeight(*root.left, h+1,sum) ;
    caculateHeight(*root.right, h+1,sum) ;

}
int main(){
    int size ;
    while (cin >> size){
        priority_queue<Node> queue ;
        while (size--){
            int val ;
            cin >> val ;
            queue.push(Node(val)) ;
        }
        while (queue.size() != 1){
            Node top1 = queue.top() ;
            queue.pop() ;
            Node top2 = queue.top() ;
            queue.pop() ;
            Node *newNode = new Node(top1.value + top2.value);
            newNode -> right = &top2 ;
            newNode -> left  = &top1 ;
            queue.push(*newNode) ;
        }
        int sum ;
        caculateHeight(queue.top(),1,sum) ;
        cout << sum << endl ;
    }
    return 0 ;
}

  • 写回答

1条回答 默认 最新

  • IT_service_mesh 2023-03-26 21:54
    关注

    参考GPT和自己的思路:在构建哈夫曼树时,新节点应该是指针类型而不是对象类型,因为在对原有的节点进行操作时,可能会出现指向已经弹出队列的对象,从而导致结果错误的情况。因此,在构建新节点时应该使用指针类型,如下所示:

    ...
    while (queue.size() != 1){
        Node* top1 = new Node(queue.top().value);
        queue.pop();
        Node* top2 = new Node(queue.top().value);
        queue.pop();
        Node *newNode = new Node(top1->value + top2->value);
        newNode -> right = top2 ;
        newNode -> left  = top1 ;
        queue.push(*newNode) ;
    }
    ...
    

    另外,在调用 caculateHeight 函数时,应该使用指向根节点的指针而不是对象本身,并且必须将 sum 初始值赋为0。更正后的代码如下所示:

    int main(){
        int size ;
        while (cin >> size){
            priority_queue<Node> queue ;
            while (size--){
                int val ;
                cin >> val ;
                queue.push(Node(val)) ;
            }
            while (queue.size() != 1){
                Node* top1 = new Node(queue.top().value);
                queue.pop();
                Node* top2 = new Node(queue.top().value);
                queue.pop();
                Node *newNode = new Node(top1->value + top2->value);
                newNode -> right = top2 ;
                newNode -> left  = top1 ;
                queue.push(*newNode) ;
            }
            int sum = 0 ;
            caculateHeight(*queue.top(),1,sum) ;
            cout << sum << endl ;
        }
        return 0 ;
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 4月16日
  • 已采纳回答 4月8日
  • 创建了问题 3月26日

悬赏问题

  • ¥20 机器学习能否像多层线性模型一样处理嵌套数据
  • ¥20 西门子S7-Graph,S7-300,梯形图
  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题
  • ¥15 matlab不知道怎么改,求解答!!
  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效