主要思路
注意本题的说明“数组 arr 中的值与树的中序遍历中每个叶节点的值一一对应”,所以说和哈夫曼树还是有一定区别的。
维护一个单调递减找,栈顶元素是最小的(不太严谨),每遍历到一个大于栈顶元素的值时,就将栈顶元素出栈,同时比较此时栈顶元素与当前元素的大小,将较小者与出栈的元素相乘即非叶节点的值。
class Solution {
public:
int mctFromLeafValues(vector<int>& arr) {
int len = arr.size();
stack<int> dec_stk;//单调递减找
dec_stk.push(INT_MAX);
int ans = 0,t;
for(int i = 0;i<len;++i) {
while(arr[i]>=dec_stk.top()) {
t = dec_stk.top();
dec_stk.pop();
ans += t * min(dec_stk.top(),arr[i]);
}
dec_stk.push(arr[i]);
}
while(dec_stk.size()>2) {
t = dec_stk.top();
dec_stk.pop();
ans += t * dec_stk.top();
}
return ans;
}
};