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, then childi is the left child of parenti.
If isLefti == 0, then childi is the right child of parenti.
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.
Solutions
Solution 1: Hash Table
We can use a hash table $\textit{nodes}$ to store all nodes, where the keys are the values of the nodes, and the values are the nodes themselves. Additionally, we use a set $\textit{children}$ to store all child nodes.
We iterate through the $\textit{descriptions}$, and for each description $[\textit{parent}, \textit{child}, \textit{isLeft}]$, if $\textit{parent}$ is not in $\textit{nodes}$, we add $\textit{parent}$ to $\textit{nodes}$ and initialize a node with the value $\textit{parent}$. If $\textit{child}$ is not in $\textit{nodes}$, we add $\textit{child}$ to $\textit{nodes}$ and initialize a node with the value $\textit{child}$. Then, we add $\textit{child}$ to $\textit{children}$.
If $\textit{isLeft}$ is true, we set $\textit{child}$ as the left child of $\textit{parent}$; otherwise, we set $\textit{child}$ as the right child of $\textit{parent}$.
Finally, we iterate through $\textit{nodes}$, and if a node's value is not in $\textit{children}$, then this node is the root node, and we return this node.
The time complexity is $O(n)$, and the space complexity is $O(n)$, where $n$ is the length of $\textit{descriptions}$.
1 2 3 4 5 6 7 8 910111213141516171819202122
# Definition for a binary tree node.# class TreeNode:# def __init__(self, val=0, left=None, right=None):# self.val = val# self.left = left# self.right = rightclassSolution:defcreateBinaryTree(self,descriptions:List[List[int]])->Optional[TreeNode]:nodes=defaultdict(TreeNode)children=set()forparent,child,isLeftindescriptions:ifparentnotinnodes:nodes[parent]=TreeNode(parent)ifchildnotinnodes:nodes[child]=TreeNode(child)children.add(child)ifisLeft:nodes[parent].left=nodes[child]else:nodes[parent].right=nodes[child]root=(set(nodes.keys())-children).pop()returnnodes[root]
/** * Definition for a binary tree node. * type TreeNode struct { * Val int * Left *TreeNode * Right *TreeNode * } */funccreateBinaryTree(descriptions[][]int)*TreeNode{nodes:=map[int]*TreeNode{}children:=map[int]bool{}for_,d:=rangedescriptions{parent,child,isLeft:=d[0],d[1],d[2]if_,ok:=nodes[parent];!ok{nodes[parent]=&TreeNode{Val:parent}}if_,ok:=nodes[child];!ok{nodes[child]=&TreeNode{Val:child}}ifisLeft==1{nodes[parent].Left=nodes[child]}else{nodes[parent].Right=nodes[child]}children[child]=true}fork,v:=rangenodes{if_,ok:=children[k];!ok{returnv}}returnnil}