输入:一个二维整数数组 descriptions,其中 descriptions[i] = [parent, child, isLeft]
要求:根据描述构造二叉树并返回根节点 isLeft == 1 表示左子节点,isLeft == 0 表示右子节点
输出:构造出的二叉树的根节点
思路:这道题的核心在于两个问题:一是如何快速找到节点并建立连接,二是如何确定谁是“根节点”。使用哈希表能很方便帮助我们解决问题。
-
利用哈希表建树(节点去重): 因为题目给出的节点描述是无序的(可能先给出叶子节点的父子关系,再给出根节点的),我们需要一个容器来存储已经创建过的节点,防止重复创建。 使用哈希表
map,key是节点值,value是对应的TreeNode指针。 -
寻找根节点(谁没有爸爸?): 在二叉树中,根节点是唯一一个没有父节点的节点。 其他所有节点都会作为
child出现在descriptions中。 因此,我们在建树的同时,可以顺便维护一个状态(比如代码中用的bool标记)。只要一个节点作为child出现过,就把它标记为true。 遍历结束后,那个存在于 map 中、但标记依然为false(从未当过儿子)的节点,就是我们要找的 Root。
复杂度:
时间复杂度:O(N)
空间复杂度:O(N)
class Solution {
public:
TreeNode* createBinaryTree(vector<vector<int>>& descriptions) {
unordered_map<int, pair<TreeNode*, bool>> nodes;
for (const auto& d : descriptions) {
int pVal = d[0];
int cVal = d[1];
bool isLeft = d[2];
if (nodes.find(pVal) == nodes.end()) {
nodes[pVal] = {new TreeNode(pVal), false};
}
if (nodes.find(cVal) == nodes.end()) {
nodes[cVal] = {new TreeNode(cVal), true};
} else {
nodes[cVal].second = true;
}
if (isLeft) {
nodes[pVal].first->left = nodes[cVal].first;
} else {
nodes[pVal].first->right = nodes[cVal].first;
}
}
for (const auto& entry : nodes) {
if (entry.second.second == false) {
return entry.second.first;
}
}
return nullptr;
}
};
1043

被折叠的 条评论
为什么被折叠?



