|
|
|
|
|
|
|
|
|
|
|
class TreeNode: |
|
|
|
|
|
def __init__(self, x): |
|
|
|
|
|
self.val = x |
|
|
|
|
|
self.left = None |
|
|
|
|
|
self.right = None |
|
|
|
|
|
|
|
|
|
|
|
def __str__(self): |
|
|
|
|
|
return "\nValue: " + str(self.val) + "\nLeft:" + str(self.left) + "\nRight:" + str(self.right) |
|
|
|
|
|
|
|
|
|
|
|
class Solution: |
|
|
|
|
|
def bstFromPreorder(self, preorder): |
|
|
|
|
|
|
|
|
|
|
|
if preorder is None or len(preorder) == 0: |
|
|
|
|
|
return None |
|
|
|
|
|
elif len(preorder) == 1: |
|
|
|
|
|
return TreeNode(preorder[0]) |
|
|
|
|
|
|
|
|
|
|
|
root = TreeNode(preorder[0]) |
|
|
|
|
|
|
|
|
|
|
|
# now collect the nodes that are less than root and make a tree from them |
|
|
|
|
|
leftChildrenItems = list(filter(lambda x: x < preorder[0], preorder[1:])) |
|
|
|
|
|
rightChildrenItems = list(filter(lambda x: x > preorder[0], preorder[1:])) # don't need >= because items are distinct |
|
|
|
|
|
|
|
|
|
|
|
root.left = self.bstFromPreorder(leftChildrenItems) |
|
|
|
|
|
root.right = self.bstFromPreorder(rightChildrenItems) |
|
|
|
|
|
|
|
|
|
|
|
return root |
|
|
|
|
|
|
|
|
|
|
|
s = Solution() |
|
|
|
|
|
print("Expected: [4, 2]") |
|
|
|
|
|
print("Got:", s.bstFromPreorder([4, 2])) |