求助各位大神,我的代码哪里有问题呀,只通过了40%的测试用例,请AI帮忙看也没看出问题
生成哈夫曼树[E卷,100分]
题目描述
给定长度为 n 的无序的数字数组,每个数字代表二叉树的叶子节点的权值,数字数组的值均大于等于 1 。请完成一个函数,根据输入的数字数组,生成[哈夫曼树],并将哈夫曼树按照中序遍历输出。
为了保证输出的[二叉树中序遍历]结果统一,增加以下限制:又树节点中,左节点权值小于等于右节点权值,根节点权值为左右节点权值之和。当左右节点权值相同时,左子树高度高度小于等于右子树。
注意: 所有用例保证有效,并能生成哈夫曼树提醒:哈夫曼树又称最优二叉树,是一种带权路径长度最短的一叉树。
所谓树的带权路径长度,就是树中所有的叶结点的权值乘上其到根结点的路径长度(若根结点为 0 00 层,叶结点到根结点的路径长度为叶结点的层数)
输入描述
例如:由叶子节点 5 15 40 30 10 生成的最优二叉树如下图所示,该树的最短带权路径长度为 40 * 1 + 30 * 2 +5 * 4 + 10 * 4 = 205 。
输出描述
输出一个哈夫曼的中序遍历数组,数值间以空格分隔
示例1
输入
5
5 15 40 30 10
输出
40 100 30 60 15 30 5 15 10
#include <functional>
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
struct TreeNode{
int val;
TreeNode* left;
TreeNode* right;
TreeNode(): val(0), left(nullptr), right(nullptr){}
TreeNode(int n): val(n), left(nullptr), right(nullptr){}
TreeNode(int n, TreeNode* left, TreeNode* right): val(n), left(left), right(right){}
};
auto method = [](TreeNode* a, TreeNode* b){
return a -> val > b -> val;
};
void inOrder(TreeNode* root){
if(root -> left){
inOrder(root -> left);
}
cout << root -> val << ' ';
if(root -> right){
inOrder(root -> right);
}
}
int getHeight(TreeNode* node) {
if (!node) return 0;
return 1 + max(getHeight(node->left), getHeight(node->right));
}
int main(){
int n;
cin >> n;
priority_queue<TreeNode*, vector<TreeNode*>, decltype(method)>nodeList(method);
int perVal;
for(int i = 0; i < n; i++){
cin >> perVal;
TreeNode* node = new TreeNode(perVal);
nodeList.push(node);
}
TreeNode* root = new TreeNode();
while(!nodeList.empty()){
if(nodeList.size() > 1){
auto a = nodeList.top();
nodeList.pop();
auto b = nodeList.top();
nodeList.pop();
TreeNode* father = new TreeNode(a -> val + b -> val);
if(a -> val < b -> val){
father -> left = a;
father -> right = b;
}
else{
int aH = getHeight(a);
int bH = getHeight(b);
if(aH < bH){
father -> left = a;
father -> right = b;
}
else{
father -> left = b;
father -> right = a;
}
}
nodeList.push(father);
}
if(nodeList.size() == 1){
root = nodeList.top();
nodeList.pop();
}
}
inOrder(root);
}
题目描述
给定长度为 n 的无序的数字数组,每个数字代表二叉树的叶子节点的权值,数字数组的值均大于等于 1 。请完成一个函数,根据输入的数字数组,生成[哈夫曼树],并将哈夫曼树按照中序遍历输出。
为了保证输出的[二叉树中序遍历]结果统一,增加以下限制:又树节点中,左节点权值小于等于右节点权值,根节点权值为左右节点权值之和。当左右节点权值相同时,左子树高度高度小于等于右子树。
注意: 所有用例保证有效,并能生成哈夫曼树提醒:哈夫曼树又称最优二叉树,是一种带权路径长度最短的一叉树。
所谓树的带权路径长度,就是树中所有的叶结点的权值乘上其到根结点的路径长度(若根结点为 0 00 层,叶结点到根结点的路径长度为叶结点的层数)
输入描述
例如:由叶子节点 5 15 40 30 10 生成的最优二叉树如下图所示,该树的最短带权路径长度为 40 * 1 + 30 * 2 +5 * 4 + 10 * 4 = 205 。
输出描述
输出一个哈夫曼的中序遍历数组,数值间以空格分隔
示例1
输入
5
5 15 40 30 10
输出
40 100 30 60 15 30 5 15 10
#include <functional>
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
struct TreeNode{
int val;
TreeNode* left;
TreeNode* right;
TreeNode(): val(0), left(nullptr), right(nullptr){}
TreeNode(int n): val(n), left(nullptr), right(nullptr){}
TreeNode(int n, TreeNode* left, TreeNode* right): val(n), left(left), right(right){}
};
auto method = [](TreeNode* a, TreeNode* b){
return a -> val > b -> val;
};
void inOrder(TreeNode* root){
if(root -> left){
inOrder(root -> left);
}
cout << root -> val << ' ';
if(root -> right){
inOrder(root -> right);
}
}
int getHeight(TreeNode* node) {
if (!node) return 0;
return 1 + max(getHeight(node->left), getHeight(node->right));
}
int main(){
int n;
cin >> n;
priority_queue<TreeNode*, vector<TreeNode*>, decltype(method)>nodeList(method);
int perVal;
for(int i = 0; i < n; i++){
cin >> perVal;
TreeNode* node = new TreeNode(perVal);
nodeList.push(node);
}
TreeNode* root = new TreeNode();
while(!nodeList.empty()){
if(nodeList.size() > 1){
auto a = nodeList.top();
nodeList.pop();
auto b = nodeList.top();
nodeList.pop();
TreeNode* father = new TreeNode(a -> val + b -> val);
if(a -> val < b -> val){
father -> left = a;
father -> right = b;
}
else{
int aH = getHeight(a);
int bH = getHeight(b);
if(aH < bH){
father -> left = a;
father -> right = b;
}
else{
father -> left = b;
father -> right = a;
}
}
nodeList.push(father);
}
if(nodeList.size() == 1){
root = nodeList.top();
nodeList.pop();
}
}
inOrder(root);
}
全部评论
相关推荐

点赞 评论 收藏
分享