#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 ;
}
如下构建哈夫曼树并求总权值的方法哪里有错误?为什么我得到的树是错误的?
- 写回答
- 好问题 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 ; }
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 1无用
悬赏问题
- ¥50 有偿求qftp工具。能连接,下载文件,发送代码,windows环境,最好qt6 要qt creator写的
- ¥70 刚刚看到一个人的网站居然是通过cname访问的
- ¥15 Attributeerror:super object has no attribute '__sklearn_tags__'_'
- ¥15 逆置单链表输出不完整
- ¥15 宇视vms-B200-A16@R启动不了,如下图所示,在软件工具搜不到,如何解决?(操作系统-linux)
- ¥500 寻找一名电子工程师完成pcb主板设计(拒绝AI生成式答案)
- ¥15 关于#mysql#的问题:UNION ALL(相关搜索:sql语句)
- ¥15 matlab二位可视化能否针对不同数值范围分开分级?
- ¥15 已经创建了模拟器但是不能用来运行app 怎么办😭自己搞两天了
- ¥15 关于#极限编程#的问题,请各位专家解答!