int main() { int caseNum; //?????? int originNum, nodeNum; //?????????,????????? int buff; //?????? BinTreeNode *binBuff; //???? BinTreeNode binTree[MAX_NUM]; cin >> caseNum; for(int i = 0; i < caseNum; i++) { BinTreeNode leftTemp; //????? BinTreeNode rightTemp; //????? priority_queue<BinTreeNode> binTreeQueue; cin >> originNum; nodeNum = 0; for(int j = 0; j < originNum; j++) { cin >> buff; binBuff = new BinTreeNode(buff); binTreeQueue.push(*binBuff); delete binBuff; } for(int j = 0; j < originNum - 1; j++) { leftTemp = binTreeQueue.top(); binTreeQueue.pop(); rightTemp = binTreeQueue.top(); binTreeQueue.pop(); binTree[nodeNum++] = leftTemp; binTree[nodeNum++] = rightTemp; //?????????????????? binBuff = new BinTreeNode(leftTemp.GetData() + rightTemp.GetData(), &(binTree[nodeNum - 2]), &(binTree[nodeNum - 1])); binTreeQueue.push(*binBuff); if(j == originNum - 2) binTree[nodeNum++] = binTreeQueue.top(); delete binBuff; } qsort(binTree, nodeNum, sizeof(BinTreeNode), BinTreeNodeCompare); BinTreeNode *root = &binTree[nodeNum - 1]; cout << WeighCalculate(root, 0) << endl; } return 0; }
bool BinTreeNode::operator==(BinTreeNode x) { if(data != x.GetData()) return false; else if(leftChild != x.GetLeftChild()) return false; else if(rightChild != x.GetRightChild()) return false; return true; }
bool operator<(BinTreeNode x, BinTreeNode y) { return x.GetData() > y.GetData(); }
bool BinTreeNode::operator<(BinTreeNode x) { return data > x.GetData(); //???????,????????????? }