算法题ACM无法通过,希望得到指导
题目
给定长度为 n 的无序的数字数组,每个数字代表二叉树的叶子节点的权值,数字数组的值均大于等于 1 。请完成一个函数,根据输入的数字数组,生成哈夫曼树,并将哈夫曼树按照中序遍历输出。 为了保证输出的二叉树中序遍历结果统一,增加以下限制:二叉树节点中,左节点权值小于等于右节点权值,根节点权值为左右节点权值之和。当左右节点权值相同时,左子树高度小于等于右子树。 注意: 所有用例保证有效,并能生成哈夫曼树,提醒:哈夫曼树又称最优二叉树,是一种带权路径长度最短的二叉树。 所谓树的带权路径长度,就是树中所有的叶结点的权值乘上其到根结点的路径长度(若根结点为 0层,叶结点到根结点的路径长度为叶结点的层数)
输入描述
例如:由叶子节点 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
我的代码
const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;
class Node{
constructor(val,left=null,right=null){
this.val = val
this.height=0
this.left = left
this.right=right
}
}
void async function () {
// Write your code here
let n=parseInt(await readline())
let weights = (await readline()).split(' ').map(Number)
//排序创建树
function creatTree(weight){
let heap = []
// 初始化所有叶子节点
for (const w of weights) {
const node = new Node(w);
node.height = 0;
heap.push(node);
}
// 自定义排序函数
function compare(node1, node2) {
if (node1.val !== node2.val) {
return node1.val - node2.val; // 权值小的优先
}
// 权值相同,高度小的优先
return node1.height - node2.height;
}
// 构建最小堆
heap.sort(compare);
while(heap.length>1){
let left = heap.shift()
let right = heap.shift()
let minLeft = left
let minRight = right
if(left.val>right.val){
minLeft = right
minRight = left
}else if(left.val == right.val){
if(left.height<=right.height){
minLeft = left
minRight = right
}else{
minLeft = right
minRight = left
}
}
let parent = new Node(minLeft.val+minRight.val,minLeft,minRight)
parent.height = 1+Math.max(minLeft.height,minRight.height)
heap.push(parent)
heap.sort(compare)
}
return heap[0]
}
//中序遍历
function readmiddle(root,result=[]){
if(!root) return
readmiddle(root.left,result)
result.push(root.val)
readmiddle(root.right,result)
return result
}
let root = creatTree(weights)
let a = readmiddle(root ,[])
console.log(a.join(' '))
}()
有同学知道哪里有问题吗?希望得到指导