diff --git a/construct_tree_pre_and_in.py b/construct_tree_pre_and_in.py new file mode 100644 index 00000000..6a0c946e --- /dev/null +++ b/construct_tree_pre_and_in.py @@ -0,0 +1,37 @@ +# Definition for a binary tree node. +from typing import List + + +class TreeNode: + def __init__(self, x): + self.val = x + self.left = None + self.right = None + + +class Solution: + def buildTree(self, preorder: List[int], inorder: List[int]) -> TreeNode: + + self.preorder_index = 0 + + # build a hashmap to store index and value for inorder list + inorder_index_map = {} + for index, value in enumerate(inorder): + inorder_index_map[value] = index + + return self.helper(0, len(preorder) - 1, preorder, inorder_index_map) + + def helper(self, left, right, preorder, inorder_index_map): + if left > right: + return None + + # select the preorder_index element as the root and increment it + root_value = preorder[self.preorder_index] + root = TreeNode(root_value) + self.preorder_index+=1 + + # build left and right subtree + root.left = self.helper(left, inorder_index_map[root_value] - 1, preorder, inorder_index_map) + root.right = self.helper(inorder_index_map[root_value] + 1, right, preorder, inorder_index_map) + + return root \ No newline at end of file diff --git a/validate_bst.py b/validate_bst.py new file mode 100644 index 00000000..39a18176 --- /dev/null +++ b/validate_bst.py @@ -0,0 +1,25 @@ +# Definition for a binary tree node. +from typing import Optional + + +class TreeNode: + def __init__(self, val=0, left=None, right=None): + self.val = val + self.left = left + self.right = right + + +class Solution: + def isValidBST(self, root: Optional[TreeNode]) -> bool: + return self.helper(root, float("-inf"), float("inf")) + + def helper(self, root, low, high): + if not root: + return True + + if root.val <= low or root.val >= high: + return False + + return self.helper(root.right, root.val, high) and self.helper( + root.left, low, root.val + )