題目來源
給一個圖,求一個根節點使得這棵樹的高度最低。
頭還有點暈…感覺不能思考…這道題怎么做,看了tags還是不懂。
看看討論區吧。
主要是一個廣度優先搜索的思想,設置多個指針,從葉子節點往里遍歷,直到最后只剩下倆指針指向同一個節點或者相差一個節點。
代碼如下:
class Solution {
public:
vector<int> findMinHeightTrees(int n, vector<pair<int, int>>& edges) {
if (n == 1)
return vector<int>{0};
unordered_map<int, unordered_set<int>> adj;
for (auto edge : edges) {
adj[edge.first].insert(edge.second);
adj[edge.second].insert(edge.first);
}
vector<int> leaves;
for (auto item : adj) {
if (item.second.size() == 1)
leaves.push_back(item.first);
}
while (n > 2) {
n -= leaves.size();
vector<int> newLeaves;
for (auto leaf : leaves) {
int nextNode = *adj[leaf].begin();
adj[leaf].erase(nextNode);
adj[nextNode].erase(leaf);
if (adj[nextNode].size() == 1)
newLeaves.push_back(nextNode);
}
leaves = newLeaves;
}
return leaves;
}
};