Description
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, thenchildiis the left child ofparenti. - If
isLefti == 0, thenchildiis 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 <= 104descriptions[i].length == 31 <= parenti, childi <= 1050 <= isLefti <= 1- The binary tree described by
descriptionsis valid.
Solutions
This function builds a binary tree from a list of descriptions that specify how numbers are connected as parents and left or right children. It uses one map to create and store each unique tree node, linking the parents to their children as it processes the list, and a second map to keep track of who each child's parent is. After establishing all the connections, the code finds the absolute top of the tree (the root) by starting at an arbitrary node and tracing its lineage upward using the parent map until it reaches the only node that has no parent, ultimately returning that root node.
/**
* Definition for a binary tree node.
* function TreeNode(val, left, right) {
* this.val = (val===undefined ? 0 : val)
* this.left = (left===undefined ? null : left)
* this.right = (right===undefined ? null : right)
* }
*/
/**
* @param {number[][]} descriptions
* @return {TreeNode}
*/
var createBinaryTree = function(descriptions) {
const map = new Map();
const parentMap = new Map();
for (const [parent, child, isLeft] of descriptions) {
let parentNode = map.get(parent);
if (!parentNode) {
parentNode = new TreeNode(parent);
map.set(parent, parentNode);
}
let childNode = map.get(child);
if (!childNode) {
childNode = new TreeNode(child);
map.set(child, childNode);
}
if (isLeft) {
parentNode.left = childNode;
} else {
parentNode.right = childNode;
}
parentMap.set(child, parent);
}
let root = descriptions[0][0];
while (parentMap.has(root)) {
root = parentMap.get(root);
}
return map.get(root);
};