此题乍一看很像拓扑排序,但仔细想一想,就算用拓扑排序排好了,建树按那个顺序是建不起来的。细想,这题其实挺简单的,因为你只需要每次连一条边,用map存节点即可。
唯一问题就是根节点怎么找,由于是连通图,只需要看看谁没有爸爸即可,我们存起来所有有爸爸的,剩下的就是根节点。
class Solution {
public:
TreeNode* createBinaryTree(vector<vector<int>>& descriptions) {
unordered_map<int, TreeNode*> m;
unordered_set<int> leaf;
for(auto d: descriptions)
{
if(!m.count(d[0]))m[d[0]] = new TreeNode(d[0]);
if(!m.count(d[1]))m[d[1]] = new TreeNode(d[1]);
leaf.insert(d[1]);
if(d[2] == 1)m[d[0]]->left = m[d[1]];
else m[d[0]]->right = m[d[1]];
}
for(auto n: m)
{
if(!leaf.count(n.first))return n.second;
}
return new TreeNode(0);
}
};