求助各位大神,我的代码哪里有问题呀,只通过了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);
}
全部评论

相关推荐

05-09 16:36
已编辑
东北林业大学 Java
一笑而过2222:功能测试 - 基础功能:文本/图片/语音/文件发送、群聊@、消息撤回(时效内/外) - 边界场景:空消息、超长文本(如5000字)、超大文件(如2GB视频) - 异常场景:断网发送(提示失败)、弱网延迟接收、对方离线消息缓存 非功能测试 - 性能:1000条消息刷屏时的卡顿情况、后台消息推送延迟 - 兼容性:iOS/Android/PC端消息显示一致性、不同微信版本适配 - 安全:消息内容加密传输、敏感词过滤(如涉黄/广告内容拦截)
查看7道真题和解析 面试问题记录
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务