コード例 #1
0
def has_path_sum(root: TreeNode, target_sum: int) -> bool:
    """
    :param root: root node of Binary Tree
    :param target_sum: target sum for path to add up to
    :return: whether the tree has a root-to-leaf path that add up to target sum
    """
    if not root:
        return False
    stack = [(root, target_sum)]
    while stack:
        current_node, sum_left = stack.pop()
        if not current_node.left and not current_node.right and current_node.val == sum_left:
            return True
        if current_node.left:
            stack.append((current_node.left, sum_left - current_node.val))
        if current_node.right:
            stack.append((current_node.right, sum_left - current_node.val))

    return False


test_cases = [
    ([5, 4, 8, 11, None, 13, 4, 7, 2, None, None, None, 1], 0, False),
    ([5, 4, 8, 11, None, 13, 4, 7, 2, None, None, None, 1], 22, True),
]
for test_tree, test_target, expected_output in test_cases:
    assert has_path_sum(
        ConstructTree.build_tree_leetcode(test_tree).root,
        test_target) is expected_output
コード例 #2
0
            if left_lower > left_upper or left_upper >= current_node.val:
                return _invalid_bst_lower, _invalid_bst_upper
        else:
            left_lower = current_node.val
        if current_node.right:
            right_lower, right_upper = BST_checker(current_node.right)
            # Right tree contains nodes with keys strictly greater than node's key
            if right_lower > right_upper or right_lower <= current_node.val:
                return _invalid_bst_lower, _invalid_bst_upper
        else:
            right_upper = current_node.val

        return left_lower, right_upper

    if not root:
        return True

    tree_lower, tree_upper = BST_checker(root)
    return tree_lower <= tree_upper


test_cases = [
    ([1, 1], False),
    ([1, 0], True),
    ([1, None, 2], True),
    ([1, None, 1], False),
]
for test_tree, expected_output in test_cases:
    assert is_valid_BST(root=ConstructTree.build_tree_leetcode(
        test_tree).root) is expected_output
コード例 #3
0
        1785, 1789, 1793, 1797, 1801, 1805, 1809, 1813, 1817, 1821, 1825, 1829,
        None, 1835, 1839, 1843, 1847, 1851, 1855, 1859, 1863, 1867, 1871, 1875,
        1879, 1883, 1887, 1891, None, 1897, 1901, 1905, 1909, 1913, 1917, 1921,
        1925, 1929, 1933, 1937, 1941, 1945, 1949, 1953, 1957, 1961, 1965, 1969,
        1973, 1977, 1981, 1985, 1989, 1993, 1997, 2001, 2005, 2009, 2013, 2017,
        None, 2023, 2027, 2031, 2035, 2039, 2043, 2047, 2051, 2055, 2059, 2063,
        2067, 2071, 2075, 2079, None, 2085, 2089, 2093, 2097, 2101, 2105, 2109,
        2113, 2117, 2121, 2125, 2129, 2133, 2137, 2141, None, 2147, 2151, 2155,
        2159, 2163, 2167, 2171, 2175, 2179, 2183, 2187, 2191, 2195, 2199, 2203,
        2207, 2211, 2215, 2219, 2223, 2227, 2231, 2235, 2239, 2243, 2247, 2251,
        2255, 2259, 2263, 2267, None, 2273, 2277, 2281, 2285, 2289, 2293, 2297,
        2301, 2305, 2309, 2313, 2317, 2321, 2325, 2329, None, 2335, 2339, 2343,
        2347, 2351, 2355, 2359, 2363, 2367, 2371, 2375, 2379, 2383, 2387, 2391,
        None, 2397, 2401, 2405, 2409, 2413, 2417, 2421, 2425, 2429, 2433, 2437,
        2441, 2445, 2449, 2453, 2457, 2461, 2465, 2469, 2473, 2477, 2481, 2485,
        2489, 2493, 2497, 2501, 2505, 2509, 2513, 2517, None, 2523, 2527, 2531,
        2535, 2539, 2543, 2547, 2551, 2555, 2559, 2563, 2567, 2571, 2575, 2579,
        None, 2585, 2589, 2593, 2597, 2601, 2605, 2609, 2613, 2617, 2621, 2625,
        2629, 2633, 2637, 2641, None, 2647, 2651, 2655, 2659, 2663, 2667, 2671,
        2675, 2679, 2683, 2687, 2691, 2695, 2699, 2703, 2707, 2711, 2715, 2719,
        2723, 2727, 2731, 2735, 2739, 2743, 2747, 2751, 2755, 2759, 2763, 2767,
        None, 2773, 2777, 2781, 2785, 2789, 2793, 2797, 2801, 2805, 2809, 2813,
        2817, 2821, 2825, 2829, None, 2835, 2839, 2843, 2847, 2851, 2855, 2859,
        2863, 2867, 2871, 2875, 2879, 2883, 2887, 2891
    ], 2791, 2851, 87451),
]
for test_tree_list, test_low, test_high, expected_output in test_cases:
    assert BST(ConstructTree.build_tree_leetcode(
        test_tree_list).root).range_accumulate(test_low,
                                               test_high) == expected_output
コード例 #4
0
        return 0

    current_level = deque([(root, 0)])  # (node, node_id)
    max_width = 0

    while current_level:
        current_level_node_count = len(current_level)
        start_id = current_id = current_level[0][1]
        for _ in range(current_level_node_count):
            current_node, current_id = current_level.popleft()
            if current_node.left:
                current_level.append((current_node.left, 2 * current_id))
            if current_node.right:
                current_level.append((current_node.right, 2 * current_id + 1))

        end_id = current_id

        max_width = max(max_width, end_id - start_id + 1)

    return max_width


test_cases = [
    ([1, 3, 2, 5, 3, None, 9], 4), ([1, 3, None, 5, 3, None, None], 2),
    ([1, 3, 2, 5, None, None, None], 2),
    ([1, 3, 2, 5, None, None, 9, 6, None, None, 7, None, None, None, None], 8)
]
for tree_list, expected_out in test_cases:
    test_tree = ConstructTree.build_tree_leetcode(tree_list)
    assert width_of_binary_tree(test_tree.root) == expected_out
コード例 #5
0
            successor = current_node.right
            while successor.left is not None and successor.left is not current_node:
                successor = successor.left

            if successor.left is None:
                # no left subtree under successor, make a temporary connection back to current_node
                # for future traversal
                successor.left = current_node
                current_node = current_node.right
            else:
                # there is left subtree: this is the temporary connection created in previous path
                # unlink the path and visit current_node
                successor.left = None
                accumulator += current_node.val
                current_node.val = accumulator
                current_node = current_node.left

    return root


test_cases = [([4, 1, 6, 0, 2, 5, 7, None, None, None, 3, None, None, None, 8],
               [30, 36, 21, 36, 35, 26, 15, None, None, None, 33, None, None, None, 8]),
              ([0, None, 1], [1, None, 1]),
              ([1, 0, 2], [3, 3, 2]),
              ([3, 2, 4, 1], [7, 9, 4, 10]), ]
for test_input, expected_output in test_cases:
    for convert_bst in [convert_bst_stack, convert_bst_morris, convert_bst_recurse]:
        test_tree = ConstructTree.build_tree_leetcode(test_input)
        test_tree.root = convert_bst(test_tree.root)
        assert test_tree.leetcode_traversal()[:len(expected_output)] == expected_output, convert_bst.__name__
コード例 #6
0
    """
    :param root: root node of binary tree
    :return: sum of left leaf nodes in the binary tree
    """
    if not root or not (root.left or root.right):
        return 0
    sum_left_leaves = 0
    # stack keep track of left leaf nodes or non leaf nodes
    dfs_stack = [root]
    while dfs_stack:
        current_node = dfs_stack.pop()
        if not current_node.left and not current_node.right:
            sum_left_leaves += current_node.val
        if current_node.left:
            dfs_stack.append(current_node.left)
        if current_node.right and (current_node.right.left
                                   or current_node.right.right):
            # filter out right leaf node
            dfs_stack.append(current_node.right)
    return sum_left_leaves


test_cases = [
    ([3, 9, 20, None, None, 15, 7], 24),
    ([1], 0),
    ([1, 2], 2),
]
for test_input, expected_output in test_cases:
    assert sum_of_left_leaves(
        ConstructTree.build_tree_leetcode(test_input).root) == expected_output
コード例 #7
0
        :return: # of paths that end at current_node and add up to target_sum + cumulative results from its descendants
        """
        if not current_node:
            return 0

        root_to_node_sum = root_to_parent_sum + current_node.val
        root_to_path_start_sum = root_to_node_sum - target_sum

        # count of paths that end at current_node and add up to target_sum
        path_count = cache.get(root_to_path_start_sum, 0)

        cache[root_to_node_sum] = cache.get(root_to_node_sum, 0) + 1
        path_count += dfs_traverse(current_node.left, root_to_node_sum, cache)
        path_count += dfs_traverse(current_node.right, root_to_node_sum, cache)

        # clear the root -> current_node path before backtracking to a different path
        cache[root_to_node_sum] -= 1

        return path_count

    path_sum_cache = {0: 1}
    return dfs_traverse(root, 0, path_sum_cache)


test_cases = [
    ([10, 5, -3, 3, 2, None, 11, 3, -2, None, 1], 8, 3),
]
for test_tree, test_target, expected_count in test_cases:
    assert path_sum(root=ConstructTree.build_tree_leetcode(test_tree).root, target_sum=test_target) == expected_count, \
        test_tree
コード例 #8
0
                None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None,
                1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1,
                None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None,
                1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1,
                None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None,
                1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1,
                None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None,
                1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1,
                None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None,
                1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1,
                None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None,
                1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1,
                None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None,
                1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1,
                None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None,
                1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1,
                None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None,
                1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1,
                None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None,
                1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1,
                None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None,
                1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1,
                None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None,
                1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1,
                None, 1, 2]), ]
for test_tree_1, test_tree_2, expected_tree in test_cases:
    get_tree = BinaryTree(merge_trees((ConstructTree.build_tree_leetcode(test_tree_1).root if test_tree_1 else None),
                                      (ConstructTree.build_tree_leetcode(test_tree_2).root if test_tree_2 else None)))
    get_tree_traversal = get_tree.leetcode_traversal()
    assert CompareTree.compare_leetcode_traversal(get_tree_traversal, expected_tree)
コード例 #9
0
test_cases = [
    ([1, 2, 3, 4, 5], 3),
    ([1, 2], 1),
    ([3, 1, None, 4, None, 2, None, 5], 4),
    ([
        -64, 12, 18, -4, -53, None, 76, None, -51, None, None, -93, 3, None,
        -31, 47, None, 3, 53, -81, 33, 4, None, -51, -44, -60, 11, None, None,
        None, None, 78, None, -35, -64, 26, -81, -31, 27, 60, 74, None, None,
        8, -38, 47, 12, -24, None, -59, -49, -11, -51, 67, None, None, None,
        None, None, None, None, -67, None, -37, -19, 10, -55, 72, None, None,
        None, -70, 17, -4, None, None, None, None, None, None, None, 3, 80, 44,
        -88, -91, None, 48, -90, -30, None, None, 90, -34, 37, None, None, 73,
        -38, -31, -85, -31, -96, None, None, -18, 67, 34, 72, None, -17, -77,
        None, 56, -65, -88, -53, None, None, None, -33, 86, None, 81, -42,
        None, None, 98, -40, 70, -26, 24, None, None, None, None, 92, 72, -27,
        None, None, None, None, None, None, -67, None, None, None, None, None,
        None, None, -54, -66, -36, None, -72, None, None, 43, None, None, None,
        -92, -1, -98, None, None, None, None, None, None, None, 39, -84, None,
        None, None, None, None, None, None, None, None, None, None, None, None,
        -93, None, None, None, 98
    ], 18),
]
for diameter_of_binary_tree in [
        diameter_of_binary_tree_local_parameter,
        diameter_of_binary_tree_global_parameter,
]:
    for test_tree_list, expected_output in test_cases:
        assert diameter_of_binary_tree(ConstructTree.build_tree_leetcode(test_tree_list).root) \
               == expected_output, diameter_of_binary_tree.__name__
    ], [10, 8, 16, 4, 2, 22]),
    ([
        80, 16, 27, 75, 60, 28, 68, 96, 7, None, 62, 45, 58, None, None, None,
        1, 54, 15, 26, 65, 70, 50, 37, None, 88, 22, None, 95, 4, 64, None, 33,
        47, 85, 13, None, 35, None, 69, None, 74, 78, None, None, None, 73, 67,
        None, 51, 61, None, 24, 55, 32, 93, 66, 79, None, None, None, None,
        None, None, 76, None, 8, 90, 82, None, None, None, 39, None, None,
        None, None, 12, 9, 3, 59, 31, 53, None, 6, None, None, 57, None, None,
        None, None, None, None, None, None, 87, None, 41, 99, None, None, 29,
        43, None, 5, 49, None, 30, None, None, 2, 89, None, None, 84, None, 21,
        52, None, None, 100, None, None, 56, 48, 34, 81, 98, None, 97, 40, 25,
        77, None, 20, 46, 86, None, None, 14, None, None, None, 36, None, None,
        None, 23, 10, 19, None, 72, None, None, None, 91, None, None, None, 92,
        17, None, None, None, None, None, None, None, 63, 11, None, None, None,
        71, None, 94, None, None, 44, 42, None, 83, None, None, None, None, 18,
        None, None, None, None, None, None, None, None, None, None, 38
    ], [
        80, 27, 68, 28, 58, 37, 69, 45, 70, 13, 79, 50, 35, 16, 75, 7, 54, 95,
        73, 90, 82, 15, 4, 67, 64, 61, 51, 39, 87, 96, 1, 88, 78, 8, 74, 76,
        57, 2, 97, 72, 94, 89, 25, 91, 40, 22, 60, 62, 65, 85, 66, 6, 93, 31,
        5, 56, 49, 34, 48, 36, 53, 30, 81, 23, 11, 63, 98, 19, 71, 18, 38, 10,
        47, 32, 59, 43, 100, 14, 3, 29, 55, 9, 99, 21, 46, 17, 83, 20, 92, 42,
        44, 52, 86, 12, 41, 84, 77, 26, 33, 24
    ],
     [80, 27, 28, 75, 64, 88, 89, 62, 65, 85, 49, 23, 98, 47, 32, 55, 21, 92]),
]
for test_input, test_voyage, expected_outcome in test_cases:
    solution = FlipMatchVoyage()
    assert solution.flip_match_voyage(ConstructTree.build_tree_leetcode(test_input).root, test_voyage) == \
           expected_outcome, test_voyage
コード例 #11
0
                -162, 2, -688, None, None, None, None, None, None, None, None, -273, None, None, None, None, 857, -724,
                None, None, None, None, None, -783, -297, None, -417, None, None, None, -767, None, -368, -478, -394,
                None, None, -453, None, None, -138, -557, None, None, None, None, None, None, None, None, None, None,
                816, 370, None, 870, None, -847, None, None, 356, 756, 849, 325, 206, None, -274, None, None, None,
                None, -561, -986, -368, None, -891, None, None, -812, None, 316, None, -608, -391, 860, 237, 540, None,
                None, None, -217, 435, None, None, None, None, None, None, None, None, None, None, 856, -120, 243, None,
                None, 774, None, None, -975, None, 994, 673, None, None, -218, 704, None, None, -240, None, None, None,
                None, None, 621, 81, -392, None, None, 898, -351, None, -437, 734, -280, 210, None, None, None, None,
                None, None, -429, None, -511, 495, -29, -622, 437, 123, None, None, -648, None, None, None, -265, None,
                None, None, None, 413, None, None, None, None, None, None, 184, -600, None, None, -62, None, None, None,
                None, 950, 212, 421, None, 897, None, None, None, None, -212, None, None, None, 33, None, -473, 9, -32,
                -175, -396, -64, None, None, 50, None, None, None, None, 691, 491, -372, None, None, None, None, None,
                922, None, None, None, None, None, None, None, None, None, -818, -685, -855, None, -231, 821, -514,
                None, None, None, None, -657, None, None, None, None, None, None, None, None, None, 268, -564, None,
                -951, None, None, None, 627, None, None, None, None, None, None, None, 965, None, None, None, None, 1,
                None, -631, None, None, None, None, None, -679, 106, None, -311, None, None, None, None, None, None,
                None, None, 735, 397, -813, None, None, None, 757, None, None, None, None, -612, None, None, -756, None,
                None, None, None, 149, None, None, 306, None, 515, None, -905, 106, None, None, None, -610, -414, -575,
                None, None, 764, 554, None, 749, -905, None, None, None, -885, None, None, -681, None, None, None, -148,
                None, -807, None, 713, None, None, 147, None, None, None, None, None, 128, None, None, 201, None, None,
                None, None, None, 75, None, None, None, None, 377, 176, -489, None, None, None, None, None, None, None,
                708, 288, 595, None, None, None, 78, -34, None, None, 942, -903, None, None, None, None, -493, None,
                None, None, None, None, None, None, None, None, None, None, 286, -132, None, -37, None, None, None,
                None, None, None, None, None, None, None, None, -129, 894, None, -828, None, None, 455, 909, None, None,
                -664, -72, None, None, None, None, None, None, None, None, 823, None, -952, None, None, -283, None,
                -967, None, 774, 149, None, None, None, None, None, 863, 461, 751, None, None, None, None, None, None,
                None, None, None, None, None, -165, -900], 41),
              ]
for test_tree_list, expected_count in test_cases:
    assert good_nodes_count(ConstructTree.build_tree_leetcode(test_tree_list).root) == expected_count
コード例 #12
0
Given a binary tree, imagine yourself standing on the right side of it, return the values of the nodes you can see
ordered from top to bottom.
"""
# Only as placeholder for test cases
from _Binary_Tree import ConstructTree

test_cases = [
    ([1, 2, 3, None, 5, None, 4], [1, 3, 4]),
    ([1, None, 3], [1, 3]),
    ([], []),
    ([
        23, 28, None, 21, None, 6, 19, 48, 8, None, None, None, None, 22, 31,
        None, None, 4, 36, 34, 30, None, None, None, None, 27, 2, None, None,
        3, 26, None, None, 55, None, 1, None, 15, 41, None, None, 37, 39, 14,
        51, None, None, None, None, 46, None, 32, 12, None, None, 45, 9, None,
        None, 29, 10, None, None, None, 18, 43, 25, 47, 50, None, 7, None,
        None, None, None, 40, 44, 17, None, None, None, 49, None, 35, 20, 11,
        54, 53, 5, None, None, 52, 33, None, None, None, 16, None, None, 42,
        38, None, None, None, None, 13, 24, None, None, None, None
    ], [
        23, 28, 21, 19, 8, 31, 36, 30, 2, 26, 55, 1, 41, 39, 51, 46, 12, 9, 10,
        18, 25, 7, 44, 17, 49, 20, 5, 16, 38, 24
    ]),
]
for test_tree, expected_output in test_cases:
    if expected_output:
        assert ConstructTree.build_tree_leetcode(
            test_tree).right_side_view() == expected_output
    else:
        assert ConstructTree.build_tree_leetcode(test_tree) is None
コード例 #13
0
                None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None,
                1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1,
                None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None,
                1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1,
                None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None,
                1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1,
                None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None,
                1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1,
                None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None,
                1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1,
                None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None,
                1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1,
                None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None,
                1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1,
                None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None,
                1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1,
                None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None,
                1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1,
                None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None,
                1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1,
                None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None,
                1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1,
                None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None,
                1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, None, 1,
                None, 1, None, 1, None, 1, None, 1, None, 1, None, 1, 2], True), ]
setrecursionlimit(1100)
for is_subtree in [is_subtree_merkle_encoding, is_subtree_node_comparison, ]:
    for tree_1_list, tree_2_list, expected_output in test_cases:
        assert is_subtree(ConstructTree.build_tree_leetcode(tree_1_list).root,
                          ConstructTree.build_tree_leetcode(tree_2_list).root) is expected_output
コード例 #14
0
"""
Serialization is the process of converting a data structure or object into a sequence of bits so that it can be stored
 in a file or memory buffer, or transmitted across a network connection link to be reconstructed later in the same or
 another computer environment.

Design an algorithm to serialize and deserialize a binary tree. There is no restriction on how your
 serialization/deserialization algorithm should work. You just need to ensure that a binary tree can be serialized to
 a string and this string can be deserialized to the original tree structure.

Clarification: The input/output format is the same as how LeetCode serializes a binary tree. You do not necessarily
 need to follow this format, so please be creative and come up with different approaches yourself.
"""
from _Binary_Tree import ConstructTree

test_cases = [[1, 2, 3, None, None, 4, 5],
              [],
              [1],
              [1, 2], ]
for test_tree_list in test_cases:
    old_tree = ConstructTree.build_tree_leetcode(test_tree_list)
    if old_tree:
        assert old_tree == ConstructTree.build_tree_leetcode(old_tree.leetcode_traversal())
コード例 #15
0
            if found_in_current_node == 2:
                # same parent
                return False

        if x_found or y_found:
            return x_found and y_found

        current_level = next_level

    return False


test_cases = [([1, 2, 3, 4], 4, 3, False),
              ([1, 2, 3, None, 4, None, 5], 5, 4, True),
              ([1, 2, 3, None, 4], 2, 3, False),
              ([1, 2, 10, 3, 4, 12, 15, 7, 6, 11, 5, 19, 16, 28, 31, None, 47, 14, 8, None, 17, 25, 13, None, None, 20,
                36, 32, None, None, None, None, None, None, 43, 23, 9, 22, None, None, 35, 39, 18, 41, None, 44, None,
                40, None, None, None, None, 29, 21, 37, 26, None, 46, None, 45, 42, 33, 24, None, None, None, 50, None,
                None, None, 48, None, 27, None, None, None, None, None, None, None, None, None, None, None, None, None,
                None, None, None, None, 49, 30, None, None, None, 34, 38], 33, 24, False),
              ([1, 18, 2, None, None, 3, 4, 17, 10, 5, 6, None, None, 21, 12, 8, 11, 31, 7, None, None, 37, 15, None, 9,
                29, 14, None, 35, 24, 20, 44, None, 19, 25, 22, 13, 41, 32, 39, 16, 36, None, None, None, 27, None,
                None, None, 23, None, None, 47, 30, 26, None, 49, None, 50, None, None, None, None, 45, 28, None, None,
                None, None, 43, None, None, None, 34, 38, None, 33, None, None, None, None, None, 46, 40, None, None,
                None, None, 48, None, 42], 28, 30, True), ]
for is_cousins in [is_cousins_one_list, is_cousins_double_list, ]:
    for test_tree_list, test_x, test_y, expected_output in test_cases:
        assert is_cousins(ConstructTree.build_tree_leetcode(test_tree_list).root, test_x, test_y) is expected_output, \
            is_cousins.__name__
コード例 #16
0
                None, 7, 6, None, None, 1, 3, None, 4, 9, 8, None, None, 0, None, 3, 4, None, 8, None, 1, None, None, 2,
                2, None, None, 4, None, None, None, 3, None, None, 2, None, None, None, 4, None, 5, None, None, None,
                None, 2, None, 5, None, None, None, None, None, None, 2, 7, 5, None, 6, None, None, None, None, 2, None,
                0, None, 3, None, 1, None, 9, 4, None, 3, None, None, None, None, None, None, None, 5, 5, 7, None, None,
                1, None, 4, 6, None, None, None, 2, None, 5, 9, 0, 6, 2, None, None, None, None, None, None, None, None,
                None, None, None, None, 5, None, 7, None, 2, 9, None, None, 1, None, None, None, 1, 6, None, 6, None,
                None, 0, 8, None, 4, None, None, None, None, 4, None, None, 0, None, 6, 0, None, None, None, 4, None,
                None, None, None, None, 0, None, None, None, None, None, None, None, None, None, None, None, None, 0, 5,
                4, 2, 6, 4, 5, 3, 4, None, None, 5, None, None, None, None, 4, None, None, 3, 6, 2, 0, None, 6, 6, None,
                None, None, None, 0, 6, None, None, None, 3, 9, 4, None, None, None, None, None, 0, None, None, 6, 7, 0,
                None, 9, 2, None, 3, 3, None, None, 8, None, 3, None, None, None, 8, 5, 3, None, 2, 4, None, 9, 6, 9,
                None, None, None, None, 6, None, 6, None, 5, 3, None, None, None, None, 4, None, None, None, 9, 0, 9, 7,
                1, 1, None, 1, None, 1, 6, None, 5, None, 6, None, None, 1, None, None, None, None, None, None, 5, None,
                None, None, None, None, 3, None, 6, 1, None, 0, 2, None, None, 0, None, None, 0, None, None, None, None,
                None, 3, None, None, 8, None, None, 5, 3, 3, None, None, None, None, None, None, None, 3, None, None, 0,
                8, 7, None, None, 8, 1, None, None, None, None, None, None, 7, None, None, None, None, None, None, None,
                None, None, None, None, 5, 2, None, 2, 6, None, None, None, None, None, None, None, 1, 5, 0, None, None,
                2, None, 7, None, None, 6, None, None, None, None, None, None, None, None, None, None, None, None, None,
                8, None, None, None, None, 3, None, None, 4, None, None, 2, None, None, None, None, 0, 3, None, None,
                None, None, None, 7, None, 8, None, None, None, None, 8, 5, None, 3, 4, None, None, None, 8, None, None,
                None, None, None, None, None, None, None, 3, 7, None, None, None, 4, 0, 3, None, None, 6, None, None,
                None, None, None, None, None, None, None, None, None, None, 8, None, None, None, None, None, 2, None,
                None, None, None, None, None, None, None, None, 0, None, None, None, 2, None, None, None, 8, 2, None,
                None, None, None, None, None, None, 8, None, None, None, None, None, None, None, None, None, None, 2,
                None, None, None, 2, 5, None, None, None, None, None, None, None, None, None, None, None, 2, None, None,
                None, None, None, 8, None, None, None, None, None, None, None, None, None, None, 0, 5, None, 1, 1]), ]
for test_tree_list, test_value, test_depth, expected_output in test_cases:
    get_tree = BinaryTree(add_one_row((ConstructTree.build_tree_leetcode(test_tree_list).root if test_tree_list
                                       else None), test_value, test_depth)).leetcode_traversal()
    assert CompareTree.compare_leetcode_traversal(get_tree, expected_output)
コード例 #17
0
                    predecessor.right = self.current_node
                    self.current_node = self.current_node.left
                # Revert the changes made in if part to restore the original tree
                # i.e., fix the right child of predecessor
                else:
                    predecessor.right = None
                    return_val = self.current_node.val
                    self.current_node = self.current_node.right
                    return return_val
        return None


for bst_iterator_type in [
        BSTIteratorMorrisTraversal,
        BSTIteratorStack,
]:
    test_bst_iterator = bst_iterator_type(
        ConstructTree.build_tree_leetcode([7, 3, 15, None, None, 9, 20]).root)
    assert test_bst_iterator.has_next()
    assert 3 == test_bst_iterator.next()
    assert 7 == test_bst_iterator.next()
    assert test_bst_iterator.has_next()
    assert 9 == test_bst_iterator.next()
    assert test_bst_iterator.has_next()
    assert 15 == test_bst_iterator.next()
    assert test_bst_iterator.has_next()
    assert 20 == test_bst_iterator.next()
    assert not test_bst_iterator.has_next()
    assert test_bst_iterator.next() is None
    assert test_bst_iterator.next() is None
コード例 #18
0
    :return: whether the tree mirror around the center line
    """
    tree_node_queue = [root.left, root.right]
    while tree_node_queue:
        left_tree_node = tree_node_queue.pop(0)
        right_tree_node = tree_node_queue.pop(0)
        if left_tree_node is None and right_tree_node is None:
            continue
        if left_tree_node is None or right_tree_node is None or left_tree_node.val != right_tree_node.val:
            return False
        tree_node_queue.extend([
            left_tree_node.left, right_tree_node.right, left_tree_node.right,
            right_tree_node.left
        ])

    return True


test_cases = [
    ([1, 2, 2, 3, 4, 4, 3], True),
    ([1, 2, 2, None, 3, None, 3], False),
    ([1, 2, 2, 3, None, None, 3], True),
    ([1], True),
    ([1, 2], False),
    ([1, None, 2], False),
]
for test_tree_list, expected_output in test_cases:
    assert is_symmetric(
        ConstructTree.build_tree_leetcode(
            test_tree_list).root) is expected_output
コード例 #19
0
    # start at second level
    left_to_right = False
    while curr_level:
        levels.append([x.val for x in curr_level])
        curr_level.reverse()
        for node in curr_level:
            if left_to_right:
                if node.left:
                    next_level.append(node.left)
                if node.right:
                    next_level.append(node.right)
            else:
                if node.right:
                    next_level.append(node.right)
                if node.left:
                    next_level.append(node.left)

        curr_level = next_level
        left_to_right = not left_to_right
        next_level = []

    return levels


test_cases = [
    ([3, 9, 20, None, None, 15, 7], [[3], [20, 9], [15, 7]]),
]
for test_tree, expected_output in test_cases:
    assert zigzag_level_order(root=ConstructTree.build_tree_leetcode(
        test_tree).root) == expected_output
コード例 #20
0
        return self.root


test_cases = [
    ([1], (2, 1), [1, 2]),
    ([1, 2, 3, 4, 5, 6], (7, 3), (8, 4), [1, 2, 3, 4, 5, 6, 7, 8]),
    ([
        43, 7, 46, 23, 31, 5, 50, 27, 2, 8, 26, 13, 43, 18, 37, 8, 26, 18, 14,
        42, 40, 23, 49, 42, 8, 10, 6, 26, 9, 37, 9, 9, 28, 44, 3, 17, 10, 38,
        2, 47
    ], (15, 42), (2, 40), (6, 40), (9, 23), (49, 23), (23, 49), (7, 49),
     (4, 42), (4, 42), (14, 8), (28, 8), (2, 10), (35, 10), (28, 6), (48, 6),
     (47, 26), (23, 26), (1, 9), (15, 9), (20, 37), (14, 37), (37, 9), (4, 9),
     (5, 9), (7, 9), (41, 28), (26, 28), (11, 44), (29, 44), (38, 3), (29, 3),
     (9, 17), (33, 17), (13, 10), (44, 10), (23, 38), (16, 38), (48, 2),
     (0, 2), (34, 47), [
         43, 7, 46, 23, 31, 5, 50, 27, 2, 8, 26, 13, 43, 18, 37, 8, 26, 18, 14,
         42, 40, 23, 49, 42, 8, 10, 6, 26, 9, 37, 9, 9, 28, 44, 3, 17, 10, 38,
         2, 47, 15, 2, 6, 9, 49, 23, 7, 4, 4, 14, 28, 2, 35, 28, 48, 47, 23, 1,
         15, 20, 14, 37, 4, 5, 7, 41, 26, 11, 29, 38, 29, 9, 33, 13, 44, 23,
         16, 48, 0, 34
     ]),
]
for test_input in test_cases:
    test_object = CBTInserter(
        ConstructTree.build_tree_leetcode(test_input[0]).root)
    for test_add_val, test_parent_val in test_input[1:-1]:
        assert test_object.insert(test_add_val) == test_parent_val
    get_tree = BinaryTree(test_object.get_root()).leetcode_traversal()
    assert CompareTree.compare_leetcode_traversal(get_tree, test_input[-1])
コード例 #21
0
            mark_parent(current_node.right, current_node)

    assert root is not None and target is not None
    mark_parent(root)

    exploration_queue = deque([(target, 0)])
    seen = {target}
    while exploration_queue:
        if exploration_queue[0][1] == k:
            return [node.val for node, _ in exploration_queue]
        current_node, depth = exploration_queue.popleft()
        for neighbor in (current_node.left, current_node.right,
                         current_node.parent):
            if neighbor and neighbor not in seen:
                seen.add(neighbor)
                exploration_queue.append((neighbor, depth + 1))

    return []


test_tree = ConstructTree.build_tree_leetcode([0, 1, None, 3, 2])
target_node = test_tree.root.left.right
assert [1] == distance_k_list_1(test_tree.root, target_node, 1)
assert [1] == distance_k_list_2(test_tree.root, target_node, 1)

test_tree = ConstructTree.build_tree_leetcode(
    [3, 5, 1, 6, 2, 0, 8, None, None, 7, 4])
target_node = test_tree.root.left
assert [7, 4, 1] == distance_k_list_1(test_tree.root, target_node, 2)
assert [7, 4, 1] == distance_k_list_2(test_tree.root, target_node, 2)
コード例 #22
0
        None, None, None, None, None, 0, None, None, None, None, None, None,
        None, 0, 0, 0, 0, 0, None, 0, 0, None, None, None, 0, 0, 0, 0, 0, None,
        None, None, None, None, 0, 0, 0, None, 0, None, None, None, None, 0, 0,
        0, None, None, None, 0, None, None, 0, 0, None, None, 0, 0, None, None,
        None, None, None, None, None, 0, None, 0, None, None, None, None, 0, 0,
        None, None, 0, 0, 0, 0, 0, None, None, 0, None, None, 0, 0, 0, 0, 0, 0,
        None, None, None, 0, None, None, None, 0, 0, None, None, None, None,
        None, None, None, None, None, None, 0, 0, None, 0, None, None, 0, None,
        0, None, None, None, None, None, None, None, 0, None, None, None, None,
        None, None, None, 0, None, 0, None, None, 0, None, None, 0, 0, None,
        None, None, 0, None, None, 0, 0, None, None, 0, 0, 0, 0, 0, 0, 0, 0,
        None, None, 0, 0, None, None, None, None, None, None, None, None, 0, 0,
        0, None, None, None, None, 0, None, 0, None, 0, None, None, None, None,
        0, 0, None, None, None, None, None, 0, 0, 0, None, 0, None, None, None,
        0, None, None, 0, 0, None, None, None, None, 0, None, None, None, None,
        None, 0, 0, None, None, None, None, None, None, 0, 0, None, None, None,
        0, None, None, None, None, None, None, None, None, None, None, 0, None,
        None, None, None, None, 0, 0, None, None, None, None, None, None, 0, 0,
        None, None, None, None, None, None, None, None, None, None, None, None,
        None, None, None, None, None, 0
    ], 360),
]
for min_camera_cover in [
        min_camera_cover_dynamic_programming,
        min_camera_cover_greedy,
]:
    for test_tree_list, expected_count in test_cases:
        assert min_camera_cover(
            ConstructTree.build_tree_leetcode(
                test_tree_list).root) == expected_count
コード例 #23
0
            19, 63, 41, 91, 43, 49, 46, 87, 74, 49, 1, 21, 62, 6, 34, 77, -9,
            61, 7, 45, 63, 7, 16
        ],
        [
            86, 63, 61, 72, 13, 24, 91, 59, 48, 14, 77, 92, 84, 76, 82, 63, 84,
            84, 94, 47, 40, 75, 20, -9, 24, 74, 51, 91, 83, 17, 42, 49, 88, 57,
            85, 1, 94, 28, 36, 78, 53, 27, 25, 46, 97, 58, 12, 33, 6, 87, 9,
            83, 90, 11, 61, 89, 46, 86, 81, 53, 59
        ],
        [
            29, 47, 97, 0, 9, 17, 91, 45, 9, 61, 21, 64, 69, 44, 12, 2, -8, 88,
            -8, 93, 86, 97, 72, 50, 47, 70, 62, -3, -5, 59, 15, -3, 37, 20, -2,
            8, 90, 61, 15, 12, 95, 73, 11, 76, 76, 49, 51
        ],
        [
            42, -9, 80, 70, 31, 78, 98, 7, 57, -3, -7, 31, 42, 62, 17, 7, 63,
            83, 51, 76, 77, 40, 95, 27, 55, 61
        ], [95, 93, 19, 37, 73, 75, 22, -7, 99, 94, 63, 39, 77, -2, 15],
        [69, 33, 9, 42, 69, 35, 36, 11, 52], [51, 50, 30], [63], [56], [28]]),
]
for test_tree_list, expected_output in test_cases:
    if test_tree_list:
        assert ConstructTree.build_tree_leetcode(
            test_tree_list).layer_traversal_by_layer() == expected_output
    else:
        assert BinaryTree(
            root=None).layer_traversal_by_layer() == expected_output
for test_tree_list, expected_output in test_cases:
    assert level_order((ConstructTree.build_tree_leetcode(test_tree_list).root if test_tree_list else None)) == \
           expected_output
コード例 #24
0
"""
Given the root of a binary search tree, and an integer k, return the kth (1-indexed) smallest element in the tree.
"""
from _BST import BST
from _Binary_Tree import ConstructTree, TreeNode, TREE_NODE_TYPE


def kth_smallest_element(root: TreeNode, k: int) -> TREE_NODE_TYPE:
    """
    :param root: root node of a non empty binary search tree, 1 <= # of nodes <= 10000
    :param k: 1 <= k <= # of nodes
    :return: value of the kth smallest element in the binary search tree
    """
    return BST(root).kth_smallest_element(k)


test_cases = [([3, 1, 4, None, 2], 1, 1),
              ([5, 3, 6, 2, 4, None, None, 1], 3, 3),
              ([41, 37, 44, 24, 39, 42, 48, 1, 35, 38, 40, None, 43, 46, 49, 0, 2, 30, 36, None, None, None, None, None,
                None, 45, 47, None, None, None, None, None, 4, 29, 32, None, None, None, None, None, None, 3, 9, 26,
                None, 31, 34, None, None, 7, 11, 25, 27, None, None, 33, None, 6, 8, 10, 16, None, None, None, 28, None,
                None, 5, None, None, None, None, None, 15, 19, None, None, None, None, 12, None, 18, 20, None, 13, 17,
                None, None, 22, None, 14, None, None, 21, 23], 25, 24),
              ([5, 3, 6, 2, 4, None, None, 1], 6, 6), ]
for test_tree_list, test_k, expected_output in test_cases:
    assert kth_smallest_element(ConstructTree.build_tree_leetcode(test_tree_list).root, test_k) == expected_output
コード例 #25
0
        272, 258, None, 266, 182, -43, 66, 48, None, None, -122, None, 205, 68,
        None, 275, None, -165, None, None, None, None, -6, 160, None, None,
        None, 80, None, 29, 278, None, None, None, None, None, 185, None, None,
        None, None, None, None, None, -70, -89, None, None, None, None, None,
        60, None, None, None, None, None, 99, 101, 16, None, -44, None, -108,
        -67, None, None, -15, None, None, None, None, None, 53, None, None,
        None, 75, -190, 86, 4, 73, 19, None, 63, 50, 245, 220, None, -184,
        None, None, 113, None, None, None, 206, 42, None, None, None, -26, -87,
        None, None, -86, None, -105, 222, 199, -145, 268, None, None, None,
        None, None, None, None, 162, 184, None, 155, None, None, None, None,
        None, None, None, 114, None, None, None, None, None, None, None, None,
        92, None, None, 9, 271, None, None, None, 218, None, None, None, None,
        -25, -47, 190, None, None, None, -148, None, None, None, None, None,
        None, None, None, 27, None, None, None, 179, -166, None, None, -75,
        None, None, 242, None, None, None, None, None, None, -144, 230, 111,
        None, -27, None, 225, 149, None, 262, None, None, 117, 200, 234, None,
        None, -124, None, None, None, None, None, 213, None, None, None, 281,
        None, 188, -72, None, None, None, None, None, None, None, None, None,
        None, None, None, None, None, None, None, None, None, None, None, None,
        None, None, None, None, None, None, 58, 297, None, None, None, None,
        None, None, None, None, None, None, None, None, 285, None, None, 207,
        None, -39, 292, -171, -52, None, None, None, None, None, None, -71,
        -114, -176
    ]),
]
for test_pre_order, test_in_order, expected_tree_list in test_cases:
    assert CompareTree.compare_leetcode_traversal(
        ConstructTree.build_tree_pre_in(test_pre_order,
                                        test_in_order).leetcode_traversal(),
        expected_tree_list)
コード例 #26
0
            # end of binary tree
            return False
        # Current level match up and next node match up with either child node
        return probe_head.val == probe_root.val and \
               (downward_probe(probe_head.next, probe_root.left) or downward_probe(probe_head.next, probe_root.right))

    if not root:
        # Empty tree
        return False
    # Start downward path from probe_root
    # or wait until child node to start downward path
    return downward_probe(head, root) or is_sub_path(
        head, root.left) or is_sub_path(head, root.right)


test_cases = [
    ([4, 2, 8],
     [1, 4, 4, None, 2, 2, None, 1, None, 6, 8, None, None, None, None, 1,
      3], True),
    ([1, 4, 2, 6],
     [1, 4, 4, None, 2, 2, None, 1, None, 6, 8, None, None, None, None, 1,
      3], True),
    ([1, 4, 2, 6, 8],
     [1, 4, 4, None, 2, 2, None, 1, None, 6, 8, None, None, None, None, 1,
      3], False)
]
for build_list, build_tree, expected_output in test_cases:
    assert is_sub_path(
        LinkedList.create_linked_list(build_list).head,
        ConstructTree.build_tree_leetcode(build_tree).root) is expected_output
コード例 #27
0
                None, None, None, None, 6, 8, 6, 9, 10, None, 8, None, None, None, None, None, None, None, None, None,
                7, None, 3, 6, 1, 6, 1, 7, None, 10, None, None, None, None, None, None, None, 10, None, None, None,
                None, 5, 5, 6, 7, 7, 6, 9, 2, None, 9, 7, 3, None, 7, 7, None, None, 8, 2, 7, 5, 4, 4, None, None, 10,
                9, None, 9, 2, None, 9, None, 2, None, None, None, None, None, None, None, 2, None, None, None, 1, 4,
                None, 2, None, 4, None, None, 2, None, 1, None, 1, None, None, 4, None, 8, None, 10, None, None, None,
                10, 7, None, None, None, None, None, None, None, None, None, None, None, None, 9, 4, 8, 6, None, None,
                None, None, None, 6, None, 2, 2, None, None, None, None, None, None, None, None, None, None, None, 6,
                10, None, 7, 6, 5, 1, 3, 3, 1, 6, 6, 5, None, None, 5, None, None, None, 2, None, None, None, None, 5,
                2, 1, 4, 9, 6, 10, 5, 6, 3, 6, 3, 4, 7, 1, None, 4, None, None, None, None, 9, None, None, None, None,
                None, 1, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None,
                8, None, None, 2, 3, None, 2, None, None, 5, 10, None, None, 6, None, 10, None, None, 10, 3, None, None,
                None, None, None, None, None, None, None, None, None, None, None, None, 9, None, 4, None, 4, 4, 6, 5, 4,
                2, 6, None, 3, 9, None, None, None, None, 10, None, 4, None, 6, None, None, 1, None, None, None, 2,
                None, None, 1, 2, 10, 8, 10, None, 10, 5, 8, None, 8, 5, None, 3, None, None, None, None, 8, None, None,
                None, None, 6, None, None, None, 7, None, None, None, 7, None, None, None, 3, None, None, None, 7, 7,
                None, None, None, 2, None, None, 9, None, 2, 8, 7, 10, 5, None, 9, None, None, None, None, None, None,
                6, 7, None, None, 4, None, None, None, None, None, None, None, None, None, None, None, 2, None, None, 7,
                None, 8, 9, 5, None, 6, 5, None, 5, None, None, None, None, None, None, None, None, None, None, None,
                None, 10, 4, None, None, None, None, None, 1, None, 2, None, None, 8, 3, 6, 4, None, None, 6, 8, None,
                None, None, None, None, None, 1, 8, None, None, None, None, None, 1, None, None, None, None, None, 4,
                None, None, 6, None, 9, None, 1, 8, None, 3, 2, None, None, 2, 7, 3, 1, 1, None, None, 6, None, 6, None,
                None, None, None, None, 3, None, 8, None, None, None, 9, 9, None, 10, 1, None, 6, 4, None, None, None,
                None, 5, 5, None, 9, None, None, None, 8, 6, None, None, None, None, None, None, None, None, None, None,
                None, None, None, 2, None, None, None, 5, 8, None, None, None, None, 3, None, None, None, None, 10, 1,
                4, None, 4, None, 6, 1, None, None, None, 2, 8, 1, None, 10, None, None, None, None, 6, None, None,
                None, 3], 13), ]
for longest_zig_zag in [longest_zig_zag_all, ]:
    for test_tree_list, expected_output in test_cases:
        assert longest_zig_zag(ConstructTree.build_tree_leetcode(test_tree_list).root) == expected_output, \
            longest_zig_zag.__name__