Given an array of integers preorder, which represents the preorder traversal of a BST (i.e., binary search tree), construct the tree and return its root.
It is guaranteed that there is always possible to find a binary search tree with the given requirements for the given test cases.
A binary search tree is a binary tree where for every node, any descendant of Node.left has a value strictly less thanNode.val, and any descendant of Node.right has a value strictly greater thanNode.val.
A preorder traversal of a binary tree displays the value of the node first, then traverses Node.left, then traverses Node.right.
We design a function $\textit{dfs}(i, j)$ to construct a binary search tree from the nodes $\textit{preorder}[i]$ to $\textit{preorder}[j]$. The answer is $\textit{dfs}(0, n - 1)$.
In $\textit{dfs}(i, j)$, we first construct the root node, which is $\textit{preorder}[i]$. Then, we use binary search to find the first node greater than $\textit{preorder}[i]$ and get its index $\textit{mid}$. We set $\textit{dfs}(i + 1, \textit{mid} - 1)$ as the left subtree of the root node and $\textit{dfs}(\textit{mid}, j)$ as the right subtree of the root node.
Finally, we return the root node.
The time complexity is $O(n \times \log n)$, and the space complexity is $O(n)$. Here, $n$ is the length of the array $\textit{preorder}$.
/** * Definition for a binary tree node. * type TreeNode struct { * Val int * Left *TreeNode * Right *TreeNode * } */funcbstFromPreorder(preorder[]int)*TreeNode{vardfsfunc(i,jint)*TreeNodedfs=func(i,jint)*TreeNode{ifi>j{returnnil}root:=&TreeNode{Val:preorder[i]}l,r:=i+1,j+1forl<r{mid:=(l+r)>>1ifpreorder[mid]>preorder[i]{r=mid}else{l=mid+1}}root.Left=dfs(i+1,l-1)root.Right=dfs(l,j)returnroot}returndfs(0,len(preorder)-1)}