def main():
    solver = Solution()
    for test in [[1, None, 2, None, None, 3]]:
        root = TreeNode()
        root.build_from_list(test)
        print(solver.preorderTraversal(root))
    pass

class Solution:
    # @param root, a tree node
    # @return a list of lists of integers

    def levelOrderBottom(self, root):
        if root is None:
            return []
        result = []
        cur_level = [root]
        next_level = []
        while len(cur_level) > 0:
            values = []
            for node in cur_level:
                values.append(node.val)
                if node.left is not None:
                    next_level.append(node.left)
                if node.right is not None:
                    next_level.append(node.right)
            cur_level = next_level
            next_level = []
            result.append(values)
        return result[::-1]

if __name__ == '__main__':
    root = TreeNode()
    root.build_from_list([3, 9, 20, None, None, 15, 7])
    res = Solution().levelOrderBottom(root)
    print(res)
        # bfs
        depth = 1
        found_leaf = False
        cur_depth = [root]
        next_depth = []
        while True:
            next_depth = []
            for node in cur_depth:
                is_leaf = True
                if node.left is not None:
                    next_depth.append(node.left)
                    is_leaf = False
                if node.right is not None:
                    next_depth.append(node.right)
                    is_leaf = False
                if is_leaf is True:
                    found_leaf = True
                    break
            if found_leaf is True:
                break
            else:
                depth += 1
                cur_depth = next_depth
        return depth


if __name__ == '__main__':
    root = TreeNode()
    root.build_from_list(list(range(10)))
    print(Solution().minDepth(root))
                ltail.left = None
                ltail.right = None
                return root, ltail
            elif root.left is not None and root.right is not None:
                lhead, ltail = gao(root.left)
                rhead, rtail = gao(root.right)
                root.left = None
                root.right = lhead
                lhead.left = None
                ltail.left = None
                ltail.right = rhead
                rhead.left = None
                rtail.left = None
                rtail.right = None
                return root, rtail

        gao(root)


solver = Solution()

root5 = TreeNode()
root5.build_from_list([1,2,3,4])
solver.flatten(root5)
print(root5.to_dict())

root4 = TreeNode()
root4.build_from_list([2,1,4,None,None,3,5])
solver.flatten(root4)
print(root4.to_dict())