Example #1
0
    def test_129_sumNumbers(self):
        root = TreeNode(4)
        root.left = TreeNode(9)
        root.right = TreeNode(0)
        root.left.left = TreeNode(5)
        root.left.right = TreeNode(1)

        self.assertEqual(1026, self.solution._129_sumNumbers(root))
 def traverse(it):
     v = next(it)
     if v == "#":
         return None
     node = TreeNode(v)
     node.left = traverse(it)
     node.right = traverse(it)
     return node
Example #3
0
 def f(self, l: list):
     mid = (len(l) - 1) // 2
     node = TreeNode(l[mid])
     if mid > 0:
         node.left = self.f(l[:mid])
     if mid < len(l) - 1:
         node.right = self.f(l[mid + 1:])
     return node
Example #4
0
 def invertTree(self, root: TreeNode) -> TreeNode:
     if not root:
         return None
     left = self.invertTree(root.left)
     right = self.invertTree(root.right)
     root.left = right
     root.right = left
     return root
Example #5
0
    def test_112_hasPathSum(self):
        root = TreeNode(1)
        root.left = TreeNode(2)
        root.right = TreeNode(3)
        root.right.left = TreeNode(6)
        root.right.right = TreeNode(7)

        self.assertEqual(True, self.solution._112_hasPathSum(root, 11))
Example #6
0
    def test_111_minDepth(self):
        root = TreeNode(1)
        root.left = TreeNode(2)
        root.right = TreeNode(3)
        root.right.left = TreeNode(6)
        root.right.right = TreeNode(7)

        self.assertEqual(2, self.solution._111_minDepth(root))
 def mergeTrees(self, t1: 'TreeNode', t2: 'TreeNode') -> 'TreeNode':
     if not t1 and not t2:
         return None
     t = TreeNode((t1.val if t1 else 0) + (t2.val if t2 else 0))
     t.left = self.mergeTrees(t1.left if t1 else None,
                              t2.left if t2 else None)
     t.right = self.mergeTrees(t1.right if t1 else None,
                               t2.right if t2 else None)
     return t
Example #8
0
 def buildTree(self, preorder: 'List[int]',
               inorder: 'List[int]') -> 'TreeNode':
     if not preorder:
         return None
     index = inorder.index(preorder[0])
     root = TreeNode(preorder[0])
     root.left = self.buildTree(preorder[1:index + 1], inorder[0:index])
     root.right = self.buildTree(preorder[index + 1:], inorder[index + 1:])
     return root
Example #9
0
    def test_104_maxDepth(self):
        root = TreeNode(1)
        root.left = TreeNode(2)
        root.right = TreeNode(2)
        root.left.left = TreeNode(3)
        root.left.right = TreeNode(4)
        root.right.right = TreeNode(3)
        root.right.right.right = TreeNode(3)

        self.assertEqual(4, self.solution._104_maxDepth(root))
Example #10
0
 def constructMaximumBinaryTree(self, nums):
     if not nums:
         return None
     max_num = max(nums)
     max_pos = nums.index(max_num)
     node = TreeNode(max_num)
     node.left, node.right = self.constructMaximumBinaryTree(
         nums[:max_pos]), self.constructMaximumBinaryTree(nums[max_pos +
                                                               1:])
     return node
Example #11
0
    def test_101_isSymmetric(self):
        root = TreeNode(1)
        root.left = TreeNode(2)
        root.right = TreeNode(2)
        root.left.left = TreeNode(3)
        root.left.right = TreeNode(4)
        root.right.left = TreeNode(4)
        root.right.right = TreeNode(3)

        self.assertEqual(True, self.solution._101_isSymmetric(root))
Example #12
0
    def test_100_isSameTree(self):
        root = TreeNode(1)
        root.left = TreeNode(2)
        root.right = TreeNode(3)
        root.left.left = TreeNode(4)
        root.left.right = TreeNode(5)
        root.right.left = TreeNode(6)
        root.right.right = TreeNode(7)

        self.assertEqual(True, self.solution._100_isSameTree(root, root))
Example #13
0
 def generate(first, last):
     trees = []
     for root in range(first, last + 1):
         for left in generate(first, root - 1):
             for right in generate(root + 1, last):
                 node = TreeNode(root)
                 node.left = left
                 node.right = right
                 trees += (node,)
     return trees or [None]
    def test_find_largest_value_in_each_tree_row(self):
        s = Solution()

        root = TreeNode(1)
        root.left = TreeNode(3)
        root.left.left = TreeNode(5)
        root.left.right = TreeNode(3)
        root.right = TreeNode(2)
        root.right.right = TreeNode(9)
        self.assertEqual([1, 3, 9], s.largestValues(root))
Example #15
0
    def test_110_isBalanced(self):
        root = TreeNode(1)
        root.left = TreeNode(2)
        root.right = TreeNode(3)
        root.right.right = TreeNode(7)

        self.assertTrue(self.solution._110_isBalanced(root))

        root.right.right.right = TreeNode(8)

        self.assertFalse(self.solution._110_isBalanced(root))
Example #16
0
    def test_107_levelOrderBottom(self):
        root = TreeNode(1)
        root.left = TreeNode(2)
        root.right = TreeNode(3)
        root.left.left = TreeNode(4)
        root.left.right = TreeNode(5)
        root.right.left = TreeNode(6)
        root.right.right = TreeNode(7)

        self.assertEqual([[4, 5, 6, 7], [2, 3], [1]],
                         self.solution._107_levelOrderBottom(root))
Example #17
0
 def allPossibleFBT(self, N):
     if N == 1:
         return [TreeNode(0)]
     res = []
     for i in range(1, N, 2):
         for left_root, right_root in product(
                 self.allPossibleFBT(i), self.allPossibleFBT(N - 1 - i)):
             root = TreeNode(0)
             root.left, root.right = left_root, right_root
             res.append(root)
     return res
Example #18
0
    def constructMaximumBinaryTree(self, nums):
        index = nums.index(max(nums))
        f_half = nums[:index]
        s_half = nums[index + 1:]
        node = TreeNode(nums[index])
        if (len(f_half) > 0):
            node.left = self.constructMaximumBinaryTree(f_half)
        if (len(s_half) > 0):
            node.right = self.constructMaximumBinaryTree(s_half)

        return node
    def mergeTrees(self, t1: 'TreeNode', t2: 'TreeNode') -> 'TreeNode':
        if t1 is None:
            return t2
        if t2 is None:
            return t1

        root = TreeNode(t1.val + t2.val)
        root.left = self.mergeTrees(t1.left, t2.left)
        root.right = self.mergeTrees(t1.right, t2.right)

        return root
 def sortedArrayToBST(self, nums):
     """
     :type nums: List[int]
     :rtype: TreeNode
     """
     if not nums:
         return None
     mid = len(nums) // 2
     node = TreeNode(nums[mid])
     node.left = self.sortedArrayToBST(nums[:mid])
     node.right = self.sortedArrayToBST(nums[mid + 1:])
     return node
Example #21
0
    def buildTree(self, inorder, postorder):
        if not inorder or not postorder:
            return None

        root = TreeNode(postorder.pop())
        inorderIndex = inorder.index(root.val)  # Line A

        root.right = self.buildTree(inorder[inorderIndex + 1:],
                                    postorder)  # Line B
        root.left = self.buildTree(inorder[:inorderIndex], postorder)  # Line C

        return root
Example #22
0
    def test_98_isValidBST(self):
        root = TreeNode(1)

        root.left = TreeNode(2)
        root.right = TreeNode(3)

        root.left.left = TreeNode(4)
        root.left.right = TreeNode(5)
        root.right.left = TreeNode(6)
        root.right.right = TreeNode(7)

        self.assertFalse(self.solution._98_isValidBST(root))
Example #23
0
    def addOneRow(self, root, v, d):
        if d == 1:
            node = TreeNode(v)
            node.left = root
            return node
        from queue import Queue

        q = Queue()
        q.put((root, 1))
        while not q.empty():
            n, depth = q.get()
            if depth == d - 1:
                left_node, right_node = TreeNode(v), TreeNode(v)
                left_node.left, right_node.right = n.left, n.right
                n.left, n.right = left_node, right_node
            else:
                if n.left:
                    q.put((n.left, depth + 1))
                if n.right:
                    q.put((n.right, depth + 1))
        return root
Example #24
0
        def generate_trees(nums: List[int]) -> List[TreeNode]:
            if not nums:
                return [None]

            trees = []
            for i, n in enumerate(nums):
                for left_tree in generate_trees(nums[:i]):
                    for right_tree in generate_trees(nums[i + 1:]):
                        root = TreeNode(n)
                        root.left = left_tree
                        root.right = right_tree
                        trees.append(root)
            return trees
Example #25
0
    def test_94_inorderTraversal(self):
        root = TreeNode(1)

        root.left = TreeNode(2)
        root.right = TreeNode(3)

        root.left.left = TreeNode(4)
        root.left.right = TreeNode(5)
        root.right.left = TreeNode(6)
        root.right.right = TreeNode(7)

        self.assertEqual([4, 2, 5, 1, 6, 3, 7],
                         self.solution._94_inorderTraversal(root))
Example #26
0
    def test_145_postorderTraversal(self):
        root = TreeNode(1)

        root.left = TreeNode(2)
        root.right = TreeNode(3)

        root.left.left = TreeNode(4)
        root.left.right = TreeNode(5)
        root.right.left = TreeNode(6)
        root.right.right = TreeNode(7)

        self.assertEqual([4, 5, 2, 6, 7, 3, 1],
                         self.solution._145_postorderTraversal(root))
Example #27
0
    def test_144_preorderTraversal(self):
        root = TreeNode(1)

        root.left = TreeNode(2)
        root.right = TreeNode(3)

        root.left.left = TreeNode(4)
        root.left.right = TreeNode(5)
        root.right.left = TreeNode(6)
        root.right.right = TreeNode(7)

        self.assertEqual([1, 2, 4, 5, 3, 6, 7],
                         self.solution._144_preorderTraversal(root))
Example #28
0
    def test_103_zigzagLevelOrder(self):
        root = TreeNode(1)

        root.left = TreeNode(2)
        root.right = TreeNode(3)

        root.left.left = TreeNode(4)
        root.left.right = TreeNode(5)
        root.right.left = TreeNode(6)
        root.right.right = TreeNode(7)

        expected = [[1], [3, 2], [4, 5, 6, 7]]

        self.assertEqual(expected, self.solution._103_zigzagLevelOrder(root))
    def sortedListToBST(self, head: ListNode) -> TreeNode:
        if not head:
            return None

        if not head.next:
            return TreeNode(head.val)

        if not head.next.next:
            root = TreeNode(head.next.val)
            root.left = TreeNode(head.val)
            return root

        # p1 is the one before the middle node.
        p1, p2 = head, head.next.next
        while p2 and p2.next:
            p2 = p2.next.next
            p1 = p1.next

        root = TreeNode(p1.next.val)
        root.right = self.sortedListToBST(p1.next.next)
        p1.next = None
        root.left = self.sortedListToBST(head)
        return root
Example #30
0
    def buildTree(self, inorder: List[int], postorder: List[int]) -> TreeNode:
        if not postorder:
            return None

        root = TreeNode(postorder[-1])
        left_tree_size = inorder.index(postorder[-1])

        left_postorder = postorder[:left_tree_size]
        right_postorder = postorder[left_tree_size:-1]
        left_inorder = inorder[:left_tree_size]
        right_inorder = inorder[left_tree_size + 1:]

        root.left = self.buildTree(left_inorder, left_postorder)
        root.right = self.buildTree(right_inorder, right_postorder)
        return root