class Solution: # inplace - swap left and right child and resursive invert left and right def invertTree(self, root): """ :type root: TreeNode :rtype: TreeNode """ if root: root.left, root.right = root.right, root.left self.invertTree(root.left) self.invertTree(root.right) return root # inplace - one liner def invertTree2(self, root): invert = self.invertTree2 if root: root.left, root.right = invert(root.right), invert(root.left) return root # import import sys, os sys.path.insert(0, os.path.abspath((os.pardir + os.sep) * 2 + 'mylib')) from BinaryTreeTraversalGenerator import TreeNode, build_tree_from_list, serialize_tree_to_array # test root = build_tree_from_list([4, 2, 7, 1, 3, 6, 9]) print(serialize_tree_to_array(Solution().invertTree(root))) root = build_tree_from_list([4, 2, 7, 1, 3, 6, 9]) print(serialize_tree_to_array(Solution().invertTree2(root)))
# self.right = None class Solution: # DP topdown resursive with memo def generateTrees(self, n): def generate(start, end): if start > end: return [None] if (start, end) in memo: return memo[(start, end)] res = [] for i in range(start, end+1): for left in generate(start, i-1): for right in generate(i+1, end): node = TreeNode(i) node.left, node.right = left, right res.append(node) memo[(start, end)] = res return res if not n: return [] memo = {} return generate(1, n) # import import sys, os sys.path.insert(0, os.path.abspath((os.pardir + os.sep) * 2 + 'mylib')) from BinaryTreeTraversalGenerator import TreeNode, serialize_tree_to_array # test for root in Solution().generateTrees(3): print(serialize_tree_to_array(root))
root.right = build(inorder_ix + 1, inorder_end) return root inorder_dict = {v: i for i, v in enumerate(inorder)} self.preorder_ix = 0 # the cur index of preorder - pass by reference return build(0, len(inorder)) # NOT len-1!! # import import sys, os sys.path.insert(0, os.path.abspath((os.pardir + os.sep) * 2 + 'mylib')) from BinaryTreeTraversalGenerator import TreeNode, serialize_tree_to_array inorder = [9, 5, 1, 7, 2, 12, 8, 4, 3, 11] preorder = [8, 5, 9, 7, 1, 12, 2, 4, 11, 3] ''' 8 / \ 5 4 / \ \ 9 7 11 / \ / 1 12 3 / 2 ''' # test print(serialize_tree_to_array(Solution().buildTree(preorder[:], inorder))) print(serialize_tree_to_array(Solution().buildTree2(preorder, inorder)))
root.right = build(inorder_ix + 1, inorder_end) root.left = build(inorder_start, inorder_ix) return root inorder_dict = {v: i for i, v in enumerate(inorder)} # the cur index of postorder - pass by reference self.postorder_ix = len(postorder) - 1 return build(0, len(inorder)) # NOT len-1!! # import import sys, os sys.path.insert(0, os.path.abspath((os.pardir + os.sep) * 2 + 'mylib')) from BinaryTreeTraversalGenerator import TreeNode, serialize_tree_to_array inorder = [9, 5, 1, 7, 2, 12, 8, 4, 3, 11] postorder = [9, 1, 2, 12, 7, 5, 3, 11, 4, 8] ''' 8 / \ 5 4 / \ \ 9 7 11 / \ / 1 12 3 / 2 ''' # test print(serialize_tree_to_array(Solution().buildTree(inorder, postorder[:]))) print(serialize_tree_to_array(Solution().buildTree2(inorder, postorder)))
/ \ 1 3 ''' # Definition for a binary tree node. # class TreeNode(object): # def __init__(self, x): # self.val = x # self.left = None # self.right = None class Solution: def sortedArrayToBST(self, nums): """ :type nums: List[int] :rtype: TreeNode """ if not nums: return None mid = len(nums) // 2 root = TreeNode(nums[mid]) root.left = self.sortedArrayToBST(nums[:mid]) root.right = self.sortedArrayToBST(nums[mid+1:]) return root # import import sys, os sys.path.insert(0, os.path.abspath((os.pardir + os.sep) * 2 + 'mylib')) from BinaryTreeTraversalGenerator import TreeNode, serialize_tree_to_array # test print(serialize_tree_to_array(Solution().sortedArrayToBST([1,2,3]))) print(serialize_tree_to_array(Solution().sortedArrayToBST([1,2,3,4,5,6,7])))