You are given a 2D integer array descriptions
where descriptions[i] = [parenti, childi, isLefti]
indicates that parenti
is the parent of childi
in a binary tree of unique values. Furthermore,
- If
isLefti == 1
, thenchildi
is the left child ofparenti
. - If
isLefti == 0
, thenchildi
is the right child ofparenti
.
Construct the binary tree described by descriptions
and return its root.
The test cases will be generated such that the binary tree is valid.
Example 1:
Input: descriptions = [[20,15,1],[20,17,0],[50,20,1],[50,80,0],[80,19,1]] Output: [50,20,80,15,17,19] Explanation: The root node is the node with value 50 since it has no parent. The resulting binary tree is shown in the diagram.
Example 2:
Input: descriptions = [[1,2,1],[2,3,0],[3,4,1]] Output: [1,2,null,null,3,4] Explanation: The root node is the node with value 1 since it has no parent. The resulting binary tree is shown in the diagram.
Constraints:
1 <= descriptions.length <= 104
descriptions[i].length == 3
1 <= parenti, childi <= 105
0 <= isLefti <= 1
- The binary tree described by
descriptions
is valid.
Solution: Hashtable + Recursion
- Use one hashtable to track the children of each node.
- Use another hashtable to track the parent of each node.
- Find the root who doesn’t have parent.
- Build the tree recursively from root.
Time complexity: O(n)
Space complexity: O(n)
C++
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
// Author: Huahua class Solution { public: TreeNode* createBinaryTree(vector<vector<int>>& descriptions) { unordered_set<int> hasParent; unordered_map<int, pair<int, int>> children; for (const auto& d : descriptions) { hasParent.insert(d[1]); (d[2] ? children[d[0]].first : children[d[0]].second) = d[1]; } int root = -1; for (const auto& d : descriptions) if (!hasParent.count(d[0])) root = d[0]; function<TreeNode*(int)> build = [&](int cur) -> TreeNode* { if (!cur) return nullptr; return new TreeNode(cur, build(children[cur].first), build(children[cur].second)); }; return build(root); } }; |