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]))