LeetCode 1008. Construct Binary Search Tree from Preorder Traversal Solution in Java, C++, Python & More | Explanation + Code

CoderIndeed
0
1008. Construct Binary Search Tree from Preorder Traversal

Description

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 than Node.val, and any descendant of Node.right has a value strictly greater than Node.val.

A preorder traversal of a binary tree displays the value of the node first, then traverses Node.left, then traverses Node.right.

 

Example 1:

Input: preorder = [8,5,1,7,10,12]
Output: [8,5,10,1,7,null,12]

Example 2:

Input: preorder = [1,3]
Output: [1,null,3]

 

Constraints:

  • 1 <= preorder.length <= 100
  • 1 <= preorder[i] <= 1000
  • All the values of preorder are unique.

Solutions

Solution 1: DFS + Binary Search

We design a function dfs(i, j) to construct a binary search tree from the nodes preorder[i] to preorder[j]. The answer is dfs(0, n - 1).

In dfs(i, j), we first construct the root node, which is preorder[i]. Then, we use binary search to find the first node greater than preorder[i] and get its index mid. We set dfs(i + 1, mid - 1) as the left subtree of the root node and dfs(mid, j) as the right subtree of the root node.

Finally, we return the root node.

The time complexity is O(n × log n), and the space complexity is O(n). Here, n is the length of the array preorder.

PythonJavaC++GoTypeScriptRust
class Solution: def bstFromPreorder(self, preorder: List[int]) -> Optional[TreeNode]: def dfs(i: int, j: int) -> Optional[TreeNode]: if i > j: return None root = TreeNode(preorder[i]) l, r = i + 1, j + 1 while l < r: mid = (l + r) >> 1 if preorder[mid] > preorder[i]: r = mid else: l = mid + 1 root.left = dfs(i + 1, l - 1) root.right = dfs(l, j) return root return dfs(0, len(preorder) - 1)(code-box)

Post a Comment

0Comments

Post a Comment (0)

#buttons=(Accept !) #days=(20)

Our website uses cookies to enhance your experience. Check Now
Accept !