生成哈夫曼树[E卷,100分]题目描述给定长度为 n 的无序的数字数组,每个数字代表二叉树的叶子节点的权值,数字数组的值均大于等于 1 。请完成一个函数,根据输入的数字数组,生成[哈夫曼树],并将哈夫曼树按照中序遍历输出。为了保证输出的[二叉树中序遍历]结果统一,增加以下限制:又树节点中,左节点权值小于等于右节点权值,根节点权值为左右节点权值之和。当左右节点权值相同时,左子树高度高度小于等于右子树。注意: 所有用例保证有效,并能生成哈夫曼树提醒:哈夫曼树又称最优二叉树,是一种带权路径长度最短的一叉树。所谓树的带权路径长度,就是树中所有的叶结点的权值乘上其到根结点的路径长度(若根结点为 0 00 层,叶结点到根结点的路径长度为叶结点的层数)输入描述例如:由叶子节点 5 15 40 30 10 生成的最优二叉树如下图所示,该树的最短带权路径长度为 40 * 1 + 30 * 2 +5 * 4 + 10 * 4 = 205 。输出描述输出一个哈夫曼的中序遍历数组,数值间以空格分隔示例1输入55 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);}