Ptr getMaxTree(const Arr<T>& data) { if (data.empty()) return nullptr; Arr<Ptr> node(data.size(), nullptr); for(int i = 0; i < data.size(); ++i) node[i] = std::make_shared<TreeNode>(data[i]); HashMap MaxMap; std::stack<Ptr> s; for (int i = 0; i < data.size(); ++i) { auto cur = node[i]; while (!s.empty() && s.top()->value < data[i]) { popStackSetMap(s, MaxMap, cur); } s.push(node[i]); } while (!s.empty()) { popStackSetMap(s, MaxMap, nullptr); } Ptr head = nullptr; for (int i = 0; i < node.size(); ++i) { auto cur = node[i]; auto res = MaxMap.find(cur); //结构如下 node left right //node是当前访问节点 left是左边离他最近比node大的点,right是右边。。 //nullptr代表没有或者到达边界 if (!res->second.first && !res->second.second) { head = res->first; } else if (!res->second.first) { if (!res->second.second->left) { res->second.second->left = res->first; } else { res->second.second->right = res->first; } } else if (!res->second.second) { if (!res->second.first->left) { res->second.first->left = res->first; } else { res->second.first->right = res->first; } } else { auto tmp = res->second.first->value < res->second.second->value ? res->second.first : res->second.second; if (!tmp->left) { tmp->left = res->first; } else { tmp->right = res->first; } } } return head; }
std::pair<int, int> getMinMax(const Arr& data) { int maxNum = INT_MIN; int minNum = INT_MAX; if (data.size() & 0x1) maxNum = minNum = data.back(); for (int i = 0; i + 1< data.size(); i+=2) { if (data[i] < data[i + 1]) { minNum = data[i] > minNum ? minNum : data[i]; maxNum = data[i+1] < maxNum ? maxNum : data[i+1]; } else { minNum = data[i + 1] > minNum ? minNum : data[i + 1]; maxNum = data[i] < maxNum ? maxNum : data[i]; } } return { minNum, maxNum }; }