[
bst
tree
]
Leetcode 1008 Construct Binary Search Tree from Preorder Traversal
Problem statement
https://leetcode.com/problems/construct-binary-search-tree-from-preorder-traversal/
Solution
We can do in simple way: find index for left part, and for right part and do recursion with time complexity O(n^2)
for skewed trees and average O(n log n)
. There is smarter solution with O(n)
time complexity, where we give the function a bound
(or two bounds - up and down) the maximum number it will handle.
The left recursion will take the elements smaller than node.val
The right recursion will take the remaining elements smaller than bound
. See also similar idea in problem 0109 Convert Sorted List to Binary Search Tree.
Complexity
It is O(n)
for time and space.
Code 1
class Solution:
def bstFromPreorder(self, preorder):
def helper(down, up):
if self.idx >= len(preorder): return None
if not down <= preorder[self.idx] <= up: return None
root = TreeNode(preorder[self.idx])
self.idx += 1
root.left = helper(down, root.val)
root.right = helper(root.val, up)
return root
self.idx = 0
return helper(-float("inf"), float("inf"))
Code 2
There is an alternative way to write it, without using global variable.
class Solution:
def bstFromPreorder(self, preorder):
def helper(down, up, idx):
if idx >= len(preorder): return (idx, None)
if not down <= preorder[idx] <= up: return (idx, None)
root = TreeNode(preorder[idx])
idx, root.left = helper(down, root.val, idx + 1)
idx, root.right = helper(root.val, up, idx)
return idx, root
return helper(-float("inf"), float("inf"), 0)[1]