예제 #1
0
    def test_binary_tree_paths(self):
        node1 = TreeNode(1)
        node2 = TreeNode(2)
        node3 = TreeNode(3)
        node5 = TreeNode(5)
        node1.left = node2
        node1.right = node3
        node2.right = node5

        s = Solution()
        res = s.binaryTreePaths(node1)
        self.assertEqual(["1->2->5", "1->3"], res)
 def test_is_valid_bst2(self):
     s = Solution()
     node1 = TreeNode(1)
     node2 = TreeNode(2)
     node3 = TreeNode(3)
     node4 = TreeNode(4)
     node5 = TreeNode(5)
     node6 = TreeNode(6)
     node5.left = node1
     node5.right = node4
     node4.left = node3
     node4.right = node6
     self.assertFalse(s.isValidBST(node5))
    def flatten(self, root: TreeNode) -> None:
        """
        Do not return anything, modify root in-place instead.
        """
        if not root:
            return

        self.flatten(root.left)
        self.flatten(root.right)

        tmp = root.right
        root.right = root.left
        root.left = None
        while root.right:
            root = root.right
        root.right = tmp
 def test_is_valid_bst(self):
     s = Solution()
     node1 = TreeNode(1)
     node2 = TreeNode(2)
     node3 = TreeNode(3)
     node2.left = node1
     node2.right = node3
     self.assertTrue(s.isValidBST(node2))
예제 #5
0
 def test_is_balanced(self):
     s = Solution()
     node1 = TreeNode(1)
     node2 = TreeNode(2)
     node3 = TreeNode(3)
     node2.left = node1
     node2.right = node3
     self.assertTrue(s.isBalanced(node2))
    def sortedArrayToBST(self, nums: List[int]) -> Optional[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
    def test_is_valid_bst3(self):
        s = Solution()
        node0 = TreeNode(0)
        node1 = TreeNode(1)
        node2 = TreeNode(2)
        node3 = TreeNode(3)
        node4 = TreeNode(4)
        node5 = TreeNode(5)
        node6 = TreeNode(6)
        node3.left = node1
        node3.right = node5
        node5.left = node4
        node5.right = node6

        node1.left = node0
        node1.right = node2
        node2.right = TreeNode(3)

        self.assertFalse(s.isValidBST(node3))
예제 #8
0
 def test_is_balanced2(self):
     s = Solution()
     node1 = TreeNode(1)
     node2 = TreeNode(2)
     node3 = TreeNode(3)
     node4 = TreeNode(4)
     node2.left = node1
     node2.right = node3
     node1.left = node4
     node4.left = TreeNode(5)
     self.assertFalse(s.isBalanced(node2))
    def buildTree(self, preorder: List[int], inorder: List[int]) -> Optional[TreeNode]:
        if not inorder:
            return None

        v = preorder.pop(0)
        i = inorder.index(v)

        root = TreeNode(v)
        root.left = self.buildTree(preorder, inorder[:i])
        root.right = self.buildTree(preorder, inorder[i + 1:])

        return root
    def vals_to_tree(self, vals: List[Optional[int]]) -> Optional[TreeNode]:
        if not vals:
            return None

        val = vals.pop(0)
        if val is None:
            return None

        root = TreeNode(val)
        root.left = self.vals_to_tree(vals)
        root.right = self.vals_to_tree(vals)

        return root
    def test_lowest_common_ancestor(self):
        node0 = TreeNode(0)
        node1 = TreeNode(1)
        node2 = TreeNode(2)
        node3 = TreeNode(3)
        node4 = TreeNode(4)
        node5 = TreeNode(5)
        node6 = TreeNode(6)
        node7 = TreeNode(7)
        node8 = TreeNode(8)
        node3.left = node5
        node3.right = node1
        node5.left = node6
        node5.right = node2
        node1.left = node0
        node1.right = node8
        node2.left = node7
        node2.right = node4

        s = Solution()
        print(s.lowestCommonAncestor(node3, node5, node1).val)
        print(s.lowestCommonAncestor(node3, node5, node4).val)
    def process(self, start: int, end: int) -> List[Optional[TreeNode]]:
        if start > end:
            return [None]

        res: List[TreeNode] = []
        for i in range(start, end + 1):
            left_list = self.process(start, i - 1)
            right_list = self.process(i + 1, end)
            for left in left_list:
                for right in right_list:
                    root = TreeNode(i)
                    root.left = left
                    root.right = right
                    res.append(root)

        return res
    def process(self, head) -> Optional[TreeNode]:
        if not head:
            return None
        if not head.next:
            return TreeNode(head.val)

        # 先得到 链表的 left_mid 节点
        left_mid = self.get_left_mid(head)
        mid = left_mid.next
        root = TreeNode(mid.val)
        # 将链表分为两段 left half and right half
        lh = head
        rh = mid.next
        left_mid.next = None
        # 递归
        root.left = self.process(lh)
        root.right = self.process(rh)

        return root