__author__ = 'clp'

from utils import TreeNode

class Solution(object):

    def invertTree(self, root):
        """
        :type root: TreeNode
        :rtype: TreeNode
        """
        def invert_tree(root):
            if root is None:
                return None
            root.left, root.right = root.right, root.left
            invert_tree(root.left)
            invert_tree(root.right)

        if root:
            invert_tree(root)
        return root

if __name__ == '__main__':
    TreeNode.print_in_level_order(Solution().invertTree(TreeNode.build_by_level_order([4, 2, 7, 1, '#',6,9])))
    TreeNode.print_in_level_order(Solution().invertTree(TreeNode.build_by_level_order([])))
from utils import TreeNode


class Solution(object):
    def sumNumbers(self, root):
        """
        :type root: TreeNode
        :rtype: int
        """
        if root is None:
            return 0
        current_level = [(root, 0)]
        s = 0
        while current_level:
            next_level = []
            for node, val in current_level:
                pivot = val * 10 + node.val
                if node.left:
                    next_level.append((node.left, pivot))
                if node.right:
                    next_level.append((node.right, pivot))
                if node.left == node.right == None:
                    s += pivot
            current_level = next_level
        return s


if __name__ == '__main__':
    print Solution().sumNumbers(TreeNode.build_by_level_order([1, 2, 3]))
    print Solution().sumNumbers(TreeNode.build_by_level_order([1]))
        :type root: TreeNode
        :rtype: int
        """
        if not root:
            return 0
        left, right = root.left, root.right
        left_height, right_height = 0, 0
        while left:
            left_height += 1
            left = left.left
        while right:
            right_height += 1
            right = right.right
        if right_height == left_height:
            return (1 << (1+left_height)) - 1
        else:
            # cl = self.countNodes(root.left)
            # cr = self.countNodes(root.right)
            # print "1 + %d + %d" % (cl, cr)
            # return 1 + cl + cr
            return 1 + self.countNodes(root.left) + self.countNodes(root.right)



if __name__ == "__main__":
    print Solution().countNodes(TreeNode.build_by_level_order([1, 2, 3, '#', '#', '#', '#']))
    print Solution().countNodes(TreeNode.build_by_level_order([1, 2, 3, 5, '#', '#', '#']))
    print Solution().countNodes(TreeNode.build_by_level_order([1, 2, 3, 5, 6, '#', '#']))
    print Solution().countNodes(None)
    print Solution().countNodes(TreeNode.build_by_level_order([1]))
    print Solution().countNodes(TreeNode.build_by_level_order([2,8,1,1,6,0,8,4,0,9,1,1,2,7,5,5,5,4,0,9,6,5,1,8,2,0,1,8,9,1,0,2,1,9,5,4,1,4,3,4,7,8,5,0,6,5,8,6,3,6,0,4,7,3,0,6,8,0,5,5,5,3,4,4,0,3,1,1,4,4,1,0,4,1,0,9,0,8,7,5,6,2,0,1,8,7,9,2,9,1,2,1,9,5,5,0,8,5,5,4,3,0,4,4,7,9,9,7,7,0,4,6,2,1,4,0,3,8,7,0,7,8,8,3,9,4,0,5,6,4,6,2,6,9,1,7,8,5,9,2,7,3,4,2,6,0,3,6,3,8,3,9,8,5,1,1,8,8,1,5,6,2,3,7,6,6,9,4,7,9,3,8,3,6,4,9,3,1,6,3,2,6,0,3,5,9,1,4,7,5,2,9,3,4,6,2,0,7,4,3,1,3,3,5,1,0,0,7,0,7,3,4,4,8,7,5,3,3,3,6,3,2,9,8,1,6,8,4,5,3,1,9,2,4,5,5,6,2,8,9,9,2,2,4,3,9,2,7,5,7,0,9,1,6,1,1,7,7,0,8,2,3,2,0,9,2,2,0,4,3,6,2,9,5,5,2,4,3,9,8,6,4,9,5,7,0,7,1,2,9,5,5,5,8,2,2,2,2,2,0,5,7,9,7,9,7,8,7,4,4,2,9,0,2,7,3,3,6,4,5,4,8,3,6,8,4,2,1,4,8,2,7,7,9,2,8,6,8,7,4,4,4,0,7,1,6,9,2,0,7,0,8,4,3,2,6,4,0,2,3,3,0,3,0,7,0,3,9,0,1,9,0,6,1,4,3,5,3,5,6,1,9,9,8,6,1,3,7,5,4,4,1,9,0,1,5,1,9,6,2,6,5,5,2,4,8,5,4,5,1,6,5,4,7,7,9,0,3,5,2,7,2,8,9,6,8,1,7,6,8,7,6,5,8,5,7,2,1,9,2,2,1,4,4,6,0,6,0,6,1,0,5,4,4,1,5,7,9,3,1,0,2,2,4,8,8,5,9,2,0,2,4,3,7,0,6,8,8,4,1,3,6,6,3,0,4,6,7,8,0,8,6,5,2,7,0,4,9,3,8,4,3,5,0,7,6,8,7,8,5,9,2,6,4,9,5,8,2,3,2,4,0,7,0,3,9,2,1,7,3,6,3,3,1,2,6,9,0,3,9,7,0,9,5,4,2,4,1,4,0,5,2,8,8,4,4,4,0,1,6,4,4,1,6,9,7,7,2,6,8,4,2,2,5,2,0,0,4,4,3,8,1,7,2,8,1,8,8,4,6,5,9,0,3,8,0,6,7,2,0,0,3,9,6,9,7,3,6,6,5,4,6,7,8,4,0,2,4,5,2,0,5,3,5,7,4,9,9,2,3,9,4,9,8,1,6,4,0,2,2,2,4,1,0,1,3,2,8,7,3,9,0,7,9,4,4,0,2,9,4,4,1,7,4,9,0,9,1,0,2,9,5,0,5,3,5,7,9,4,4,7,5,6,0,5,5,7,4,1,0,4,5,8,8,5,5,4,0,7,3,9,5,9,5,5,1,7,8,6,9,2,2,9,1,1,4,6,4,3,6,9,6,2,5,3,9,4,1,7,1,2,0,7,8,3,8,8,2,4,1,3,7,8,2,6,4,0,1,0,4,8,8,2,1,4,4,2,4,3,6,5,2,4,0,0,2,1,4,4,3,2,9,5,1,8,3,4,8,0,5,6,9,5,7,8,9,4,1,8,0,6,1,3,8,4,8,8,2,1,3,1,4,9,1,5,0,2,4,8,8,9,9,6,0,3,7,3,8,8,3,4,6,7,5,5,8,2,5,6,9,8,8,0,8,8,5,4,6,3,6,0,5,4,9,6,5,9,5,9,7,0,9,2,6,8,2,1,0,5,8,7,6,3,8,8,2,8,0,8,4,6,6,3,2,3,1,7,0,1,7,2,8,2,6,8,0,6,7,3,9,6,6,3,8,1,9,3,0,2,6,4,8,8,2,5,5,6,7,4,5,5,7,3,4,0,3,1,9,9,1,5,7,8,5,4,8,4,0,6,1,0,7,5,4,1,0,6,0,5,5,0,8,4,0,0,3,9,4,1,2,5,1,0,6,5,9,9,0,8,1,4,6,2,5,5,9,9,5,4,8,2,0,0,7,7,2,8,5,5,9,2,7,7,7,2,4,8,0,0,5,2,9,4,8,4,8,5,9,2,0,5,8,0,4,4,2,0,5,3,2,0,6,2,6,3,9,0,7,0,5,8,2,4,2,9,0,4,1,2,9,8,7,8,0,8,9,4,3,5,2,7,1,2,8,1,7,2,8,4,1,4,7,7,5,0,7,9,7,2,7,7,3,2,7,6,6,2,8,0,0,3,3,0,1,2,8,5,6,9,5,7,6,0,3,5,5,0,6,6,0,1,1,3,1,7,1,6,4,7,2,7,8,2,0,0,1,7,8,3,9,7,2,7,3,2,6,3,5,0,5,8,6,0,9,9,8,9,1,3,4,3,1,9,8,1,4,4,7,6,8,7,2,7,4,0,9,8,2,7,5,1,3,0,1,8,5,4,5,1,2,5,1,0,3,7,7,9,0,3,0,7,6,6,2,2,1,3,7,1,9,2,1,7,9,7,4,0,8,0,5,4,3,9,0,3,1,3,1,0,0,6,0,1,7,0,0,3,8,5,2,0,7,2,0,2,4,3,6,5,1,4,5,3,2,1,4,1,5,6,2,6,8,6,4,1,6,8,7,4,9,3,1,9,8,8,5,7,9,0,4,0,7,0,9,9,9,9,2,3,5,8,2,3,0,9,4,3,4,6,6,3,0,3,6,5,8,5,6,5,9,2,5,2,6,7,6,5,7,9,1,5,0,4,1,0,8,6,3,7,9,4,5,5,7,2,1,3,9,2,4,3,2,8,2,1,6,9,3,7,1,8,1,8,2,6,1,5,9,4,8,8,5,7,7,7,6,4,4,6,5,2,8,2,5,8,2,4,8,1,7,8,0,1,1,4,3,1,8,9,3,5,4,5,1,3,1,5,4,0,9,5,4,4,5,9,0,8,9,4,4,2,0,4,6,9,6,9,3,4,6,0,2,1,7,7,1,6,5,9,4,5,8,5,8,2,0,2,9,8,5,7,2,5,0,0,6,4,6,7,5,7,6,2,6,2,3,4,4,9,0,1,5,3,8,8,7,0,4,6,5,4,1,0,2,7,8,1,0,2,0,7,4,2,0,4,9,1,3,3,7,8,3,6,4,9,9,6,4,7,8,3,1,9,3,7,8,0,2,5,3,9,5,6,7,6,7,6,1,4,9,3,8,0,9,4,5,8,9,9,2,6,6,0,2,8,2,5,6,5,7,5,9,7,5,6,6,5,0,6,3,1,7,1,2,3,7,9,9,7,6,3,8,4,6,7,9,5,5,6,7,1,0,5,6,7,1,5,1,9,9,9,8,8,1,3,6,2,7,6,1,2,8,9,8,7,5,8,8,4,1,6,9,2,3,3,0,2,8,3,9,6,3,2,7,6,8,2,2,3,3,4,2,1,6,9,4,3,7,5,1,5,2,7,6,0,8,5,2,4,1,7,3,9,5,7,2,8,4,2,4,8,9,6,1,7,5,2,5,2,0,6,8,3,7,5,7,3,9,6,4,1,0,0,3,0,3,0,3,4,3,5,4,8,7,5,1,0,4,7,6,2,1,1,5,4,2,0,2,1,2,6,2,1,3,3,2,1,2,1,1,2,0,0,7,6,7,3,6,3,7,1,2,9,3,8,5,3,9,4,5,8,7,0,7,4,0,0,7,0,6,5,7,9,6,3,0,5,3,7,7,7,8,5,5,3,0,1,7,6,1,5,4,0,1,9,3,9,9,8,7,2,4,1,3,0,7,5,5,9,5,5,8,6,5,8,1,3,7,2,8,8,0,8,5,7,0,2,0,3,5,3,2,1,2,7,7,1,0,4,9,5,3,7,7,9,1,0,7,2,4,0,0,4,9,3,0,9,0,3,1,1,6,1,4,5,8,0,6,2,5,7,5,3,6,2,3,2,1,6,6,8,3,0,1,7,2,3,3,4,4,0,8,5,5,8,4,2,5,2,9,1,5,3,9,2,2,3,8,7,3,7,7,6,1,9,7,0,3,2,5,9,1,5,8,4,6,7,6,6,2,0,7,1,1,5,0,3,2,0,2,2,8,0,2,7,7,8,7,0,4,6,7,6,4,7,7,4,9,1,5,9,2,6,4,5,4,6,3,6,2,8,6,6,4,8,1,0,8,7,0,1,1,8,9,6,2,8,5,9,2,5,4,7,6,5,3,2,0,9,8,3,8,6,5,0,7,2,2,4,1,0,7,1,0,1,4,9,0,6,0,6,1,6,3,8,4,9,7,5,9,5,4,0,5,6,6,0,7,1,7,5,2,8,5,3,9,7,6,2,0,7,6,0,7,9,5,6,8,3,1,8,7,3,0,5,1,3,3,4,8,2,7,6,7,2,4,4,4,5,2,5,9,8,2,3,7,9,2,4,3,9,2,1,8,4,4,3,9,3,0,2,6,3,3,8,5,6,3,3,3,4,3,9,8,2,3,1,3,3,3,2,8,6,3,3,8,2,5,2,6,5,7,6,5,8,3,0,5,7,3,4,8,6,7,6,3,8,6,4,9,1,1,9,2,7,1,7,5,0,9,4,2,1,0,0,7,2,4,3,0,6,5,7,1,3,2,1,9,0,8,0,9,4,3,6,0,0,1,2,0,9,6,0,9,6,9,6,2,1,4,9,8,9,6,1,3,7,4,3,8,3,5,2,3,8,9,1,6,5,7,4,0,7,4,9,1,2,9,9,1,3,2,2,1,9,2,0,3,9,4,5,4,4,4,1,2,4,1,4,9,7,3,3,0,1,2,8,7,0,1,5,7,4,4,5,4,6,0,9,0,3,6,3,1,7,1,5,7,5,4,4,0,6,9,6,2,9,2,5,7,8,0,9,2,6,0,2,5,6,2,5,5,0,6,8,0,2,7,6,3,5,2,8,2,1,9,5,2,4,6,9,2,3,9,2,2,3,5,6,0,4,7,8,9,2,1,8,3,9,1,7,1,0,9,1,1,1,9,1,2,8,8,5,6,6,5,2,9,2,6,1,3,3,2,5,6,5,5,4,6,6,3,1,7,1,0,5,5,8,8,2,0,9,0,0,9,7,0,8,7,7,2,5,7,8,5,1,1,6,7,5,1,8,0,7,5,0,6,4,4,4,7,0,9,9,5,3,9,0,5,3,2,0,1,6,6,6,0,0,4,8,8,8,1,9,6,2,0,5,7,7,4,9,3,4,2,3,0,5,3,1,5,7,4,3,9,7,6,5,0,6,5,9,8,3,4,6,3,1,9,2,0,7,6,3,4,2,8,1,0,6,4,1,7,9,0,3,3,9,4,3,8,2,8,3,5,5,7,8,9,8,9,2,4,0,6,9,4,8,8,0,5,8,1,8,0,5,0,6,2,8,9,6,3,7,5,7,7,1,7,1,6,7,0,9,1,9,4,7,3,9,6,3,0,3,1,0,1,8,3,5,7,7,3,7,8,9,6,6,7,3,3,9,3,6,7,3,4,8,6,7,4,2,4,5,7,7,7,2,3,5,0,7,6,2,7,7,0,3,2,9,9,8,0,9,3,3,7,0,6,4,3,7,0,9,6,7,5,3,7,8,0,9,0,5,1,0,5,3,5,7,6,0,7,4,7,1,4,3,5,6,3,9,5,8,8,8,2,1,1,5,9,2,8,0,5,0,7,8,0,2,3,4,3,4,4,3,1,1,7,1,9,9,7,2,2,4,0,5,8,3,0,7,9,9,6,3,1,8,5,2,7,8,2,4,1,4,2,2,5,3,3,6,1,1,9,9,5,7,8,9,7,8,5,3,2,1,9,5,0,0,2,0,1,6,1,8,5,6,8,6,0,5,0,0,7,4,6,9,2,6,4,5,5,5,4,9,9,6,8,2,6,7,4,9,5,2,1,3,0,9,8,4,4,0,5,0,1,9,7,2,3,6,8,4,1,2,5,3,8,0,1,5,7,4,5,9,2,2,5,4,5,9,6,0,9,5,9,9,1,5,9,3,6,2,9,1,4,2,9,4,1,1,0,9,6,0,6,6,1,8,1,9,5,6,9,7,6,6,2,8,8,5,4,7,5,0,1,9,1,0,1,8,5,4,5,8,5,2,1,6,7,5,6,4,2,0,2,1,1,9,1,2,7,8,7,5,4,6,8,6,6,2,2,2,4,3,8,5,2,0,8,3,8,2,0,7,9,4,5,0,3,2,6,2,5,0,2,5,3,0,6,6,2,7,7,7,5,4,9,6,4,0,8,0,8,1,2,5,7,2,8,8,5,0,6,1,3,3,5,0,6,7,4,9,3,0,9,9,3,6,9,2,0,1,1,6,3,3,5,0,1,6,0,1,9,2,2,4,4,0,3,5,2,0,1,5,6,5,9,9,6,2,9,6,2,0,5,9,9,8,1,2,3,4,0,0,0,6,2,5,5,2,8,0,8,5,9,2,3,5,3,1,7,1,5,1,4,5,4,0,3,4,8,3,7,4,5,4,9,8,9,8,7,5,2,7,9,2,7,3,8,8,4,0,7,5,0,6,8,3,2,4,3,7,6,7,1,4,4,8,6,8,3,4,6,4,6,4,7,9,1,1,4,1,3,8,8,8,7,4,4,9,6,3,7,6,8,1,6,8,3,1,1,6,8,4,1,4,7,5,0,6,9,0,9,1,4,7,0,7,6,0,1,1,1,1,2,5,6,8,9,8,2,7,4,7,2,0,4,4,8,4,9,7,3,0,9,7,9,5,4,5,1,7,2,9,4,0,3,1,5,6,2,3,6,7,4,3,0,6,1,2,4,8,2,3,8,6,4,9,1,8,6,0,3,9,1,4,9,2,1,3,4,8,7,5,4,6,0,5,9,4,8,1,9,7,4,6,7,5,7,5,1,4,0,4,8,7,7,4,0,9,0,7,9,3,3,7,0,0,8,3,5,9,4,3,8,4,5,0,3,1,7,4,1,2,3,5,0,3,6,1,4,3,4,7,9,4,8,5,8,0,5,9,7,6,1,5,4,1,2,9,7,9,1,9,5,8,4,2,6,8,1,0,0,3,3,9,6,0,5,9,5,4,0,6,3,1,1,4,5,9,7,1,7,3,3,9,1,3,9,0,7,5,8,5,0,3,3,4,1,5,1,6,2,7,7,6,2,8,1,3,6,0,5,1,0,9,8,4,1,9,0,0,3,1,7,5,2,6,2,5,2,5,5,8,7,7,6,1,3,8,7,4,8,7,6,0,8,0,5,2,4,8,9,3,7,3,9,3,2,7,5,7,8,8,6,1,8,8,2,0,2,9,7,7,7,5,1,9,3,3,5,8,5,7,2,7,5,3,1,7,4,8,7,5,1,2,6,9,1,4,9,2,4,7,1,3,3,8,0,1,8,1,2,5,6,6,8,4,9,7,5,2,3,0,0,3,1,5,3,7,6,1,0,0,7,2,9,2,0,1,0,5,6,1,8,1,0,0,6,7,1,1,7,7,2,5,8,4,9,1,2,7,8,3,1,8,6,2,1,5,4,6,5,0,1,2,3,0,8,7,3,9,3,5,7,0,2,7,2,7,3,9,3,4,3,0,3,3,3,1,6,0,8,9,4,2,5,8,3,5,2,5,7,2,8,6,9,1,2,1,8,1,4,3,3,7,2,2,0,4,2,0,2,8,0,4,5,2,4,4,3,6,1,2,4,8,0,7,7,7,2,3,4,9,7,1,2,1,0,2,0,1,1,8,3,0,1,8,8,4,4,2,7,9,3,0,2,5,4,8,9,6,2,2,8,0,6,7,0,8,6,8,0,3,0,2,1,2,7,0,2,2,1,1,4,7,0,5,8,3,5,4,6,5,6,6,3,0,8,0,7,5,9,8,5,5,3,2,1,2,8,0,2,7,3,3,0,2,1,2,1,3,5,3,1,7,0,0,0,7,4,7,9,7,8,3,2,6,2,4,4,7,2,6,9,8,3,5,3,7,6,8,5,6,2,1,3,8,3,9,2,8,6,0,2,3,2,5,0,7,1,0,5,2,7,1,2,9,5,2,9,6,4,8,5,8,8,8,5,9,8,0,7,3,7,2,7,9,6,5,6,4,6,4,1,0,6,8,4,8,5,9,5,3,7,4,1,2,5,9,6,7,5,1,3,9,4,9,8,9,2,4,7,3,8,6,6,8,0,1,7,4,2,1,6,9,8,3,1,3,3,7,8,1,5,7,1,8,7,7,4,6,7,6,9,0,4,6,3,0,5,8,7,4,8,3,9,2,8,5,5,4,2,1,6,9,2,1,7,6,8,2,3,1,4,8,6,2,3,6,0,6,2,9,2,2,0,1,9,8,6,4,9,9,5,1,2,4,2,6,9,9,0,7,0,9,7,9,2,6,2,0,6,5,8,3,0,9,2,4,1,6,1,3,3,9,7,9,7,0,7,2,6,5,4,6,3,1,7,1,2,8,9,8,7,6,4,3,1,7,1,5,8,2,6,6,2,3,6,3,9,7,6,7,9,4,0,4,8,7,0,4,6,2,4,6,6,7,1,3,2,0,0,4,2,2,8,3,6,3,6,2,4,0,0,2,1,9,9,6,9,1,9,0,0,2,1,4,5,2,1,8,5,1,0,0,6,4,4,2,9,1,5,4,4,4,0,9,0,3,5,2,1,0,9,3,6,9,9,3,7,3,9,3,9,4,5,1,0,9,5,5,1,8,8,0,3,0,7,7,8,2,5,1,0,4,1,5,0,7,9,5,8,6,9,7,1,1,7,9,1,8,7,7,5,9,2,6,8,0,7,7,3,1,7,9,5,5,8,2,0,2,4,3,4,7,8,5,8,4,0,2,2,6,4,4,5,7,4,9,6,9,5,5,8,1,1,2,5,6,8,6,1,3,8,9,3,6,0,1,5,8,0,3,7,0,6,2,6,4,2,2,2,9,0,8,7,8,0,3,3,0,8,8,9,8,3,3,1,2,3,2,6,4,5,7,3,9,2,8,9,5,8,7,6,8,2,5,7,3,9,0,7,9,9,3,3,7,6,5,1,6,9,2,8,1,0,9,2,0,5,0,8,9,5,9,2,6,3,3,5,9,3,5,6,6,4,3,0,6,1,8,2,9,0,4,2,5,3,9,5,1,0,8,0,7,2,2,9,1,2,5,7,3,6,3,1,9,7,4,2,4,2,8,5,7,3,1,5,3,1,1,8,7,4,6,3,7,3,1,7,5,7,7,8,8,7,8,0,3,1,8,5,0,3,2,1,6,3,3,1,2,7,3,8,7,9,9,3,2,3,7,4,4,3,1,3,3,0,3,1,0,9,7,2,1,5,9,1,7,4,2,4,2,8,3,8,1,1,3,3,2,0,8,0,3,4,0,1,8,6,3,8,8,1,8,9,0,1,8,0,5,5,6,2,4,9,4,6,4,7,0,3,7,8,3,0,0,2,8,2,9,3,1,7,4,8,0,3,9,2,1,7,2,1,8,3,8,3,0,5,4,6,8,5,1,9,8,2,5,2,8,0,6,3,4,0,1,6,9,0,4,5,6,5,3,4,7,7,7,5,9,4,4,7,9,6,8,4,5,8,4,1,4,0,3,5,7,9,8,2,8,6,9,3,9,4,7,1,4,3,9,0,1,0,6,7,3,0,1,3,0,4,0,2,6,7,9,1,1,5,5,5,8,4,2,5,0,8,6,9,1,0,4,2,8,3,6,6,8,5,7,4,0,1,1,8,9,4,4,0,8,4,3,9,7,8,8,5,2,6,9,9,3,7,5,6,7,3,6,0,2,9,8,8,0,6,1,6,8,5,3,1,9,2,6,5,1,3,5,2,1,4,9,1,7,3,5,0,8,4,4,7,0,2,1,2,7,4,6,5,1,6,2,1,0,6,7,1,9,5,5,5,1,5,2,2,5,4,4,0,3,7,9,3,6,7,5,9,0,0,6,3,3,8,7,6,7,2,3,4,2,3,2,4,5,8,4,6,1,5,8,8,5,0,0,8,5,6,0,1,2,8,6,7,1,3,7,3,0,3,3,7,3,0,2,3,4,5,5,8,7,4,6,3,5,0,1,3,6,0,3,9,6,9,0,1,3,5,8,2,3,0,0,3,9,4,1,2,5,2,1,7,9,9,4,8,8,3,3,3,2,3,2,3,1,6,8,6,8,3,2,3,1,3,3,8,1,8,8,9,3,5,1,4,7,4,3,0,2,9,3,4,9,8,5,2,0,8,8,8,4,6,8,5,1,0,0,7,3,3,9,0,8,1,8,5,3,5,8,7,8,5,4,9,7,4,6,3,7,3,5,4,2,7,0,5,8,6,3,9,7,4,0,3,9,5,3,3,7,3,0,7,8,1,2,0,5,0,5,2,9,3,4,4,1,7,5,5,4,2,6,8,3,8,0,4,1,8,4,9,3,8,6,6,9,8,7,7,5,3,1,6,3,4,1,5,5,5,7,2,0,9,8,4,3,8,8,6,4,4,1,5,9,8,5,1,4,0,5,1,6,3,4,8,7,6,1,2,2,8,1,3,9,7,5,4,7,1,2,5,4,0,3,8,7,1,2,4,0,9,9,9,2,7,2,7,4,7,8,5,1,0,7,8,4,1,1,4,9,1,3,8,8,0,6,7,9,5,0,5,4,9,7,3,1,2,0,8,8,5,7,3,8,1,2,7,6,6,4,0,5,9,8,3,1,2,9,5,4,8,6,7,4,8,7,5,4,5,7,1,5,8,8,7,6,7,2,6,4,5,4,1,1,2,1,4,8,1,7,9,9,9,9,1,4,4,0,0,1,8,6,1,3,3,8,3,8,4,4,0,7,6,7,4,4,8,3,7,8,0,9,1,8,9,8,3,7,5,3,4,5,8,3,1,7,7,3,9,2,5,4,3,2,0,3,2,3,9,7,3,5,2,2,2,6,4,3,6,1,9,7,3,5,3,3,0,6,0,9,1,5,7,7,9,3,7,7,2,1,0,3,4,4,6,4,8,9,0,7,8,8,7,7,0,3,8,5,5,4,7,6,2,2,2,6,4,5,1,0,3,4,6,5,4,3,6,7,1,0,7,4,1,5,4,0,6,1,1,8,3,1,0,1,8,2,8,1,6,7,3,9,8,2,6,6,3,5,0,2,0,8,5,9,8,9,1,2,2,3,0,8,1,0,1,5,6,1,6,2,9,2,8,3,5,9,8,9,4,9,5,8,7,9,4,6,0,3,5,7,9,6,2,3,9,2,0,6,9,9,6,5,7,3,6,9,0,1,9,3,3,6,2,0,6,4,5,4,8,3,8,5,8,2,0,6,7,3,4,8,0,5,1,6,6,0,9,8,3,1,0,2,3,1,1,0,6,5,4,8,8,6,7,9,7,4,0,6,4,4,0,0,7,2,4,6,5,0,0,0,1,5,7,1,4,9,3,2,4,8,7,4,1,9,1,3,2,1,4,1,6,7,5,9,2,5,1,0,6,0,8,6,1,0,2,9,4,3,0,8,3,5,8,6,5,9,5,6,0,3,6,4,3,1,4,9,5,7,5,0,8,9,9,2,8,3,1,1,2,4,2,0,5,3,2,8,7,6,0,1,6,9,7,0,9,5,1,8,5,4,5,5,9,5,4,2,8,1,9,6,7,5,5,9,7,5,9,5,8,3,6,0,0,5,6,3,4,1,2,7,9,7,7,5,6,9,2,1,0,7,1,7,6,8,4,2,7,7,8,7,1,4,2,1,4,9,0,8,8,1,9,1,5,4,9,5,3,3,8,3,6,9,8,3,9,7,1,9,3,4,1,7,7,7,3,5,6,2,4,4,4,0,4,8,9,3,2,0,5,5,2,5,3,6,2,0,2,8,8,1,7,5,6,9,5,4,1,8,2,8,4,6,4,7,2,4,8,3,6,1,6,1,3,2,5,5,9,7,8,0,7,1,1,6,9,3,3,7,9,6,8,2,8,9,8,8,9,9,7,5,6,8,9,8,3,1,0,5,7,1,2,2,6,3,2,5,6,0,5,7,8,3,6,9,4,6,3,2,9,6,7,8,9,5,9,8,7,2,4,3,7,8,7,0,6,3,2,8,5,8,5,9,5,9,4,8,9,2,0,5,1,1,9,1,9,8,4,1,9,7,8,1,2,6,6,1,3,5,3,1,9,5,4,2,4,3,1,0,2,6,5,3,3,5,4,4,8,2,9,6,1,2,5,4,1,1,4,4,8,1,5,3,7,7,1,4,0,3,0,0,8,0,1,2,6,0,7,9,8,1,1,7,3,9,2,9,8,6,0,4,4,0,0,3,6,6,4,4,5,2,7,7,6,9,6,0,4,8,0,0,5,2,1,3,9,0,3,4,7,0,2,3,8,2,5,4,2,5,1,3,3,8,0,0,9,8,9,1,2,6,8,7,5,3,8,0,4,4,5,5,3,8,1,9,4,5,3,9,4,9,8,3,1,5,7,0,3,6,9,5,1,6,0,3,4,3,2,8,7,6,5,3,6,1,1,5,7,6,6,7,8,5,8,8,1,0,7,5,3,1,0,3,7,9,3,2,0,3,1,9,8,2,5,1,2,7,4,0,4,9,3,3,1,4,0,3,4,9,5,1,0,7,8,1,7,0,7,8,0,4,2,7,3,3,0,1,8,9,5,0,7,3,7,4,3,7,5,6,9,8,6,8,0,4,0,0,0,1,2,0,4,9,4,0,9,2,4,2,2,7,8,9,8,1,6,4,0,8,7,2,5,3,1,2,8,9,8,8,6,8,2,5,5,4,0,7,7,9,8,2,2,5,5,2,6,3,2,7,5,1,1,9,7,8,6,7,1,6,7,5,4,3,1,1,2,6,6,7,5,9,6,2,3,6,8,8,5,3,7,4,0,3,9,3,2,4,4,5,9,2,7,6,6,9,0,7,9,6,5,0,0,1,9,7,3,7,2,7,9,6,6,1,1,9,7,5,6,0,7,8,6,2,8,9,1,5,0,4,3,8,0,3,4,1,4,9,9,4,9,7,2,1,0,8,1,1,5,4,1,6,0,6,8,5,4,8,2,9,5,5,3,9,6,6,1,0,7,6,4,4,9,1,5,7,7,7,8,1,8,2,7,1,5,6,2,6,3,7,2,0,7,3,8,7,4,1,3,1,6,7,8,1,5,4,0,8,2,1,6,9,5,9,1,7,4,5,4,6,1,0,3,3,7,7,4,1,4,4,7,8,6,1,1,5,1,2,4,7,0,2,6,2,2,9,8,1,0,6,5,4,8,1,6,3,6,7,4,8,2,1,5,3,5,7,1,5,3,7,5,9,3,0,0,1,7,2,2,5,0,7,8,5,3,8,8,3,2,2,9,5,1,8,8,5,7,8,9,0,0,2,2,8,0,1,8,3,9,0,2,9,3,6,4,0,4,9,7,7,2,4,9,1,0,6,5,2,3,5,5,4,1,1,1,2,0,1,1,4,2,7,2,4,7,8,1,7,5,5,9,5,3,8,2,4,3,5,7,7,9,7,5,0,3,3,9,6,1,3,8,4,0,2,4,7,1,6,4,0,8,4,3,3,9,1,0,6,6,0,3,1,9,5,6,8,5,6,2,8,9,5,9,4,2,8,8,4,5,1,4,9,6,8,2,8,8,0,5,8,6,6,9,3,9,5,2,3,3,4,1,8,0,5,0,8,7,0,1,4,2,0,0,0,7,0,2,1,1,3,4,5,3,8,1,9,1,7,9,1,7,9,5,9,0,2,1,6,7,0,8,0,2,8,8,5,2,2,6,8,7,8,2,9,8,7,4,6,4,6,8,6,3,5,4,8,3,3,4,1,9,7,2,2,9,9,3,0,4,3,0,1,0,2,3,2,3,5,6,1,2,9,0,1,3,5,1,9,8,7,5,4,2,6,4,7,8,9,1,3,4,2,2,6,3,2,3,2,9,8,6,4,1,0,6,7,7,9,7,5,9,5,7,8,0,0,9,0,0,9,6,7,9,8,1,2,7,3,2,6,9,0,2,8,1,6,2,1,2,9,3,1,8,0,2,7,3,0,2,2,9,9,3,8,0,4,7,1,9,3,7,4,3,5,1,1,8,7,3,4,9,4,8,9,3,6,7,0,4,7,9,2,2,0,6,5,3,0,2,8,1,0,8,7,2,6,7,3,2,0,3,2,7,8,9,1,9,3,8,0,1,7,3,7,6,4,2,9,8,1,6,3,7,7,0,3,5,1,7,1,3,5,0,6,7,5,2,9,9,6,7,4,1,0,8,3,0,3,5,7,1,1,3,8,5,3,7,2,2,8,8,1,3,6,9,4,3,5,5,1,4,1,9,9,6,3,6,9,8,9,5,6,4,7,2,5,8,7,7,7,0,0,1,1,6,5,8,4,1,3,8,4,5,1,4,0,7,0,3,8,1,5,8,3,3,5,6,5,9,7,8,2,3,5,9,6,9,1,4,4,0,1,0,2,9,3,4,3,6,4,6,2,5,6,2,0,7,2,0,8,2,0,5,6,8,7,9,7,0,6,3,4,5,6,6,7,2,9,3,6,9,0,7,9,1,3,0,0,1,3,7,5,2,9,8,4,4,4,6,8,0,6,7,4,6,4,9,2,0,8,5,7,4,7,0,0,2,8,8,0,4,9,8,3,6,0,0,1,0,8,5,8,2,5,0,1,9,3,6,6,2,1,7,3,4,1,2,9,6,0,9,8,9,1,7,3,8,9,7,4,8,8,7,9,9,3,2,5,1,1,4,5,6,5,1,5,8,4,3,5,3,7,3,3,4,9,3,8,3,9,7,4,6,8,7,2,9,5,5,3,8,1,4,7,6,7,8,7,0,3,1,4,1,5,8,0,0,3,2,8,9,9,2,9,2,1,6,6,3,5,0,8,3,0,7,1,9,9,7,4,7,0,5,6,4,5,5,8,4,4,2,4,2,9,0,0,9,6,2,1,9,8,0,8,6,2,0,0,7,4,0,9,7,6,0,2,2,6,3,7,3,0,6,7,1,3,6,2,4,3,5,3,1,5,8,0,7,0,3,4,7,2,6,5,9,7,1,4,4,9,8,2,4,5,3,0,2,9,6,1,3,3,3,5,6,9,6,1,2,5,3,0,2,9,3,0,7,5,3,3,0,1,0,0,9,4,6,4,4,9,8,6,0,0,3,6,5,6,1,6,3,3,8,2,5,0,0,7,5,1,1,7,0,5,5,0,1,0,7,1,4,1,0,3,5,9,1,9,0,3,5,4,3,7,8,4,9,6,8,4,0,5,1,9,7,4,8,5,1,1,8,8,7,1,0,3,5,9,3,2,1,0,9,6,4,2,7,5,7,1,4,8,9,0,0,7,1,2,6,4,7,4,2,3,7,5,7,8,1,8,9,3,1,9,6,3,9,8,4,2,4,8,7,4,5,0,7,1,2,0,1,6,2,6,8,5,3,7,0,4,2,9,5,3,7,1,4,6,8,8,2,9,9,4,7,7,5,0,0,3,9,0,3,0,8,5,5,1,9,7,3,1,4,7,8,5,7,5,8,8,0,6,6,9,7,7,6,3,7,0,6,5,9,9,7,0,7,2,3,8,7,6,1,8,7,3,7,3,2,2,4,2,2,4,7,5,4,2,1,3,9,4,4,5,0,2,1,5,0,0,5,7,5,5,2,7,8,7,7,4,7,0,9,8,9,4,1,7,6,1,4,6,0,8,9,2,6,7,9,3,2,8,0,5,4,6,9,2,8,3,0,4,0,8,0,9,9,3,0,2,9,5,4,2,2,0,0,0,5,3,8,2,8,0,5,3,1,6,4,3,9,7,9,8,1,0,8,5,2,6,9,9,6,4,5,2,3,8,5,5,3,3,2,9,4,3,9,4,2,7,9,2,5,6,7,4,0,9,2,2,2,7,3,7,3,3,6,5,6,7,5,2,7,0,9,1,2,3,3,0,1,5,3,2,3,7,6,6,1,3,1,3,0,5,4,0,3,0,4,8,0,0,1,9,7,2,4,9,5,2,1,7,0,5,2,1,6,0,5,2,8,7,9,9,9,0,8,1,8,9,9,8,5,2,7,4,5,2,3,6,0,4,6,4,3,5,8,7,4,3,0,1,9,1,1,2,8,8,8,3,1,0,9,4,3,7,2,3,6,7,4,8,6,5,7,3,0,7,7,0,3,0,8,5,4,1,9,5,7,2,3,2,2,4,5,9,4,9,7,0,4,6,4,3,8,2,1,9,2,7,3,1,3,7,1,7,5,9,5,6,7,8,5,4,1,3,5,2,9,7,0,0,8,8,8,4,7,1,0,9,2,7,1,0,6,2,2,7,6,6,3,1,8,8,7,3,8,4,6,4,8,7,7,3,4,0,2,9,1,3,0,9,0,7,0,5,8,3,7,5,2,7,5,5,0,0,7,3,1,2,2,4,9,0,3,7,7,5,4,7,4,7,3,4,7,0,9,2,3,7,7,2,8,0,4,1,2,3,1,1,9,3,5,4,7,9,6,6,8,7,3,7,4,2,4,5,2,4,0,5,5,0,8,2,8,6,7,5,0,7,2,9,5,6,6,9,9,7,8,7,3,0,2,2,6,2,3,0,3,1,7,9,0,1,4,7,5,8,9,4,5,8,8,7,5,0,6,5,9,1,6,8,5,7,9,5,4,6,7,6,7,6,1,3,4,0,2,5,6,8,1,7,0,4,9,8,4,1,4,6,1,0,9,0,5,1,5,9,5,7,8,1,3,1,7,7,1,6,0,9,1,8,4,4,9,8,9,8,6,9,4,2,3,8,3,0,9,7,5,1,4,1,7,1,6,7,4,9,4,3,6,2,3,9,5,5,4,2,1,5,6,8,8,3,3,8,2,2,7,5,1,0,9,2,2,8,6,7,0,4,6,4,6,2,3,6,0,2,1,5,7,8,4,9,7,2,2,7,0,6,0,5,8,6,9,1,7,8,7,6,7,9,2,4,7,4,4,2,6,7,8,1,0,1,2,1,7,9,8,5,0,3,1,4,3,6,9,4,0,0,3,5,5,4,4,7,8,8,8,9,5,7,5,1,1,5,0,2,2,9,8,4,2,4,5,7,2,3,6,5,1,6,0,2,4,7,1,8,6,1,7,6,3,0,0,5,4,5,9,4,6,5,1,1,3,8,0,3,9,9,0,5,9,3,7,0,5,2,5,7,7,9,7,6,1,6,7,1,1,1,1,9,3,3,8,7,7,6,9,2,9,9,9,0,7,0,9,3,8,5,0,7,9,0,1,6,5,3,4,8,2,5,9,9,5,9,5,2,1,4,1,6,7,7,5,6,7,6,9,3,6,3,7,2,0,9,5,1,8,5,2,8,1,8,8,8,2,8,5,8,3,5,9,5,3,2,2,9,7,5,1,3,1,0,9,3,8,0,9,1,1,3,4,8,2,8,6,9,3,2,5,5,1,7,6,0,3,0,8,1,3,9,4,6,1,3,9,0,2,2,4,0,7,0,4,7,7,8,7,9,2,4,0,4,7,4,8,2,1,0,2,7,8,0,9,4,5,8,2,2,0,1,3,0,8,5,5,8,0,8,2,7,4,7,8,1,8,4,8,4,2,7,8,4,4,8,0,2,2,5,6,7,1,0,7,3,6,3,6,7,3,6,2,5,0,6,4,0,6,4,5,5,4,0,9,3,9,2,9,6,9,5,2,0,4,9,5,7,6,8,0,8,5,5,0,2,4,5,0,7,5,5,4,2,2,0,2,3,4,9,9,4,0,8,4,9,6,2,9,8,9,5,6,7,0,2,1,7,5,7,9,7,3,6,6,3,6,0,2,0,1,7,7,4,1,4,2,9,3,3,5,2,5,8,7,4,7,8,8,3,6,5,6,5,3,4,4,5,1,5,3,0,5,6,2,8,4,1,1,2,8,0,4,7,0,9,9,6,7,9,2,6,1,6,7,9,8,7,8,2,1,6,7,7,9,1,2,3,1,9,1,3,6,1,5,3,5,8,0,9,6,6,3,8,1,3,1,8,6,2,6,9,6,7,3,6,4,2,3,2,6,7,2,9,3,0,8,3,9,0,3,0,7,6,1,0,4,9,8,0,0,9,9,5,0,4,2,6,4,2,8,3,0,7,8,1,8,5,4,8,5,6,5,7,4,0,6,6,6,7,6,4,4,7,6,5,3,3,7,5,0,1,8,7,8,5,0,5,3,8,4,5,6,1,2,7,2,7,6,4,8,5,5,0,5,9,2,4,6,7,8,2,9,4,6,6,4,6,6,4,0,8,0,7,1,8,6,4,9,5,3,5,1,9,6,7,7,3,4,5,7,6,5,2,3,9,9,6,3,4,6,3,6,4,9,0,3,3,6,6,0,6,3,3,4,0,1,0,2,1,2,8,8,8,2,1,7,6,2,6,7,4,6,9,8,8,8,9,2,5,7,0,2,7,4,6,9,0,1,6,8,6,3,9,7,1,8,0,8,4,3,5,1,4,0,3,5,0,7,1,1,3,4,0,5,5,8,6,1,1,3,4,4,7,4,2,8,1,9,6,5,0,0,5,0,7,2,2,2,3,2,0,8,2,2,3,0,6,4,4,1,2,6,3,0,3,7,8,9,0,0,2,6,2,1,2,5,1,0,7,6,5,7,7,8,9,8,4,5,2,1,1,7,9,0,2,8,8,8,1,2,0,3,7,9,6,2,2,4,3,2,0,7,8,8,0,5,9,1,6,6,9,3,1,6,0,9,3,1,2,4,9,8,8,2,2,2,8,1,8,3,1,9,3,6,4,5,5,8,3,6,4,3,7,7,7,1,6,0,8,6,9,1,7,7,0,1,0,4,1,9,7,5,3,7,0,3,0,6,5,0,6,5,1,3,7,0,6,7,7,8,8,2,0,1,8,0,0,2,5,2,9,3,0,8,8,4,8,9,1,7,3,4,2,3,4,6,4,1,9,2,5,5,3,0,8,1,6,5,2,9,4,3,1,6,7,0,0,9,1,2,6,6,5,1,7,4,0,6,9,9,7,8,3,7,9,5,7,6,4,7,0,1,4,2,4,1,4,8,2,5,6,1,8,6,4,8,9,6,5,4,0,5,1,7,0,8,7,1,5,0,0,3,6,0,6,8,3,3,1,6,7,0,9,7,0,9,1,8,7,0,8,4,1,4,7,0,0,4,7,4,9,3,7,1,3,3,7,5,2,7,8,9,7,1,7,9,6,7,5,8,1,4,2,6,5,8,2,7,6,0,2,7,8,5,2,3,8,4,8,4,3,3,6,3,2,2,5,4,9,6,2,6,0,4,8,9,7,5,1,2,5,6,6,8,8,2,7,1,8,3,1,2,6,4,2,6,3,4,6,5,8,3,3,7,5,0,9,6,5,3,8,4,3,5,7,1,5,6,2,9,4,0,7,1,0,6,9,4,3,9,2,3,5,9,9,4,4,1,9,0,9,4,7,5,1,8,6,1,8,4,5,6,5,8,2,0,1,6,7,4,6,8,4,4,2,5,4,3,6,3,9,1,5,7,2,4,6,1,5,7,2,1,1,0,7,0,0,4,9,0,4,4,2,2,8,9,9,1,1,4,3,5,9,3,6,0,6,3,3,7,7,3,6,1,6,3,6,0,4,2,6,7,8,7,5,0,4,7,7,4,6,7,6,3,4,8,3,2,9,5,5,8,0,9,3,3,7,7,1,6,3,6,4,7,0,1,7,7,2,7,3,0,9,8,1,4,0,3,6,7,0,0,6,9,9,5,8,5,2,5,8,2,3,6,7,3,5,8,7,0,1,9,8,6,7,1,2,1,5,0,2,8,2,6,9,5,2,2,7,4,6,5,4,7,4,3,7,3,3,8,6,7,3,2,5,4,1,6,4,6,9,9,4,2,4,5,7,7,0,7,9,9,0,1,5,0,7,2,6,0,0,4,5,9,1,1,3,9,4,1,5,1,4,3,5,1,9,5,4,9,7,6,3,5,5,4,2,0,4,5,1,1,8,3,2,7,5,7,1,8,6,0,0,7,8,8,1,3,7,2,9,6,7,8,7,5,7,5,1,6,5,1,0,7,1,9,7,2,9,1,8,3,2,3,5,1,6,5,5,9,4,4,4,5,7,0,8,0,1,3,4,9,9,3,8,9,0,5,4,0,5,3,2,9,0,5,1,4,9,6,2,3,0,7,5,1,0,3,7,3,5,9,9,4,6,4,6,6,4,7,4,7,9,2,3,3,8,1,6,0,9,1,5,7,7,6,7,1,2,9,5,8,5,3,1,2,3,7,7,0,5,9,6,2,5,5,4,8,1,1,5,4,0,9,3,7,7,2,8,9,6,6,9,6,2,3,3,4,8,4,2,4,0,5,8,8,4,1,0,9,8,5,6,6,5,9,5,2,5,2,9,5,2,6,9,2,5,2,3,0,9,8,6,8,8,6,5,6,0,3,8,5,7,6,5,4,8,0,1,6,9,8,9,8,3,5,3,7,5,4,7,3,3,2,4,9,5,4,0,8,3,4,7,4,0,6,6,4,4,2,8,3,9,4,7,6,0,0,2,3,0,1,3,1,2,0,9,6,3,9,6,7,1,7,9,5,2,7,5,2,9,7,0,9,1,4,9,2,9,1,5,5,4,4,4,1,7,5,5,8,9,0,6,7,4,6,7,1,5,8,1,3,0,2,2,3,7,8,8,3,9,1,3,9,7,7,1,3,3,0,8,4,0,7,4,3,3,5,1,4,8,4,9,9,1,9,0,5,1,2,6,3,9,8,1,5,8,7,1,1,2,5,2,7,7,6,7,2,4,0,7,3,5,1,3,4,7,8,1,2,9,1,9,5,4,4,3,8,1,3,0,2,5,5,3,4,3,4,4,0,4,9,9,5,8,4,9,9,3,8,1,3,8,8,2,5,0,1,1,1,3,9,1,6,4,3,8,7,8,6,1,0,7,2,5,1,3,3,3,0,5,9,2,9,0,8,1,8,4,6,4,5,6,4,1,7,8,5,4,5,0,3,7,0,4,8,2,5,7,8,1,5,0,5,7,5,6,1,3,9,0,2,9,9,5,1,9,2,0,8,4,7,0,8,6,2,5,7,4,9,1,4,2,7,0,5,6,3,4,9,5,1,0,2,6,7,2,1,8,4,1,4,3,2,1,5,1,7,6,7,6,6,9,4,0,0,2,1,7,8,6,5,0,6,2,4,7,8,1,4,8,2,4,7,0,0,0,6,4,4,4,5,9,0,0,0,7,0,0,4,6,6,0,6,9,3,8,6,6,5,6,8,5,3,6,1,8,3,5,0,7,8,8,1,6,3,1,9,5,0,9,9,0,0,4,7,2,9,3,1,8,4,3,6,9,9,4,4,3,8,6,0,7,4,4,5,2,4,0,1,6,9,2,1,9,8,5,9,7,3,4,0,1,9,8,9,6,2,3,1,4,0,2,4,6,2,4,6,2,1,3,2,7,4,2,3,8,4,1,4,5,4,7,7,9,5,3,3,6,9,2,6,7,2,3,0,2,7,0,8,2,5,3,7,4,0,2,8,2,4,3,9,4,6,8,8,4,4,1,3,4,7,9,6,5,6,5,9,0,9,5,2,2,0,8,8,4,7,0,5,7,5,2,9,5,9,9,0,9,4,9,4,4,0,0,0,2,7,8,2,6,7,3,5,1,4,2,3,2,4,3,1,6,7,1,3,1,4,1,8,5,7,3,4,8,9,9,3,1,8,9,3,4,9,0,6,7,0,5,8,7,5,8,4,8,2,3,1,1,6,5,9,0,7,5,7,9,4,9,9,6,2,1,3,0,4,9,0,6,1,7,9,4,7,5,6,6,9,7,5,6,5,3,3,4,0,0,9,8,1,6,7,9,6,1,9,0,1,7,7,1,9,6,6,0,9,7,1,2,7,9,9,3,7,8,0,3,1,3,0,1,4,5,0,6,4,3,1,3,6,3,8,9,4,8,5,4,6,8,8,5,0,3,3,2,0,5,8,0,3,3,6,4,3,5,8,2,8,4,2,7,6,6,8,3,1,1,5,7,4,1,1,3,6,9,6,9,2,7,7,0,3,7,8,4,2,3,2,7,0,2,7,2,8,7,5,5,1,4,3,5,4,9,8,2,7,8,7,7,2,2,3,3,2,0,4,3,9,4,9,4,1,5,8,1,3,9,9,4,5,1,8,3,8,3,1,5,4,9,8,0,9,5,9,9,4,1,8,4,1,1,4,8,8,5,6,3,8,7,4,7,3,5,5,6,5,7,7,6,4,8,1,3,8,1,9,9,0,3,3,2,1,7,7,9,1,9,6,0,4,7,6,0,3,8,4,8,3,0,0,5,8,9,4,5,2,0,1,9,2,3,1,0,5,1,9,2,9,5,1,9,0,4,9,8,2,7,3,8,7,5,5,5,7,3,1,9,9]))
from utils import TreeNode


class Solution(object):
    def kthSmallest(self, root, k):
        """
        :type root: TreeNode
        :type k: int
        :rtype: int
        """
        parent_stack = []
        node = root
        count = 0
        while parent_stack or node:
            if node:
                parent_stack.append(node)
                node = node.left
            else:
                node = parent_stack.pop()
                count += 1
                if count == k:
                    return node.val
                node = node.right


if __name__ == '__main__':
    print Solution().kthSmallest(TreeNode.build_by_level_order([2, 1, 3]), 2)
    print Solution().kthSmallest(TreeNode.build_by_level_order([2, 1, 3]), 4)
    print Solution().kthSmallest(None, 2)
    print Solution().kthSmallest(None, 4)
    print Solution().kthSmallest(None, 4)
            elif root.left is None:
                return min_depth(root.right, level + 1)
            elif root.right is None:
                return min_depth(root.left, level + 1)
            else:
                return min([
                    min_depth(root.left, level + 1),
                    min_depth(root.right, level + 1)
                ])

        return min_depth(root, 1) if root else 0


if __name__ == '__main__':
    print Solution().minDepth(
        TreeNode.build_by_level_order([1, 2, 2, 3, 4, 4, 3]))
    print Solution().minDepth(TreeNode.build_by_level_order([1, 2, '#']))
    print Solution().minDepth(
        TreeNode.build_by_level_order([1, 2, 2, '#', 3, '#', 3]))
    print Solution().minDepth(TreeNode.build_by_level_order([1]))
    print Solution().minDepth(
        TreeNode.build_by_level_order([
            6, 82, 82, '#', 53, 53, '#', -58, '#', '#', -58, '#', -85, -85,
            '#', -9, '#', '#', -9, '#', 48, 48, '#', 33, '#', '#', 33, 81, '#',
            '#', 81, 5, '#', '#', 5, 61, '#', '#', 61, '#', 9, 9, '#', 91, '#',
            '#', 91, 72, 7, 7, 72, 89, '#', 94, '#', '#', 94, '#', 89, -27,
            '#', -30, 36, 36, -30, '#', -27, 50, 36, '#', -80, 34, '#', '#',
            34, -80, '#', 36, 50, 18, '#', '#', 91, 77, '#', '#', 95, 95, '#',
            '#', 77, 91, '#', '#', 18, -19, 65, '#', 94, '#', -53, '#', -29,
            -29, '#', -53, '#', 94, '#', 65, -19, -62, -15, -35, '#', '#', -19,
            43, '#', -21, '#', '#', -21, '#', 43, -19, '#', '#', -35, -15, -62,
示例#6
0
from utils import TreeNode


class Solution(object):
    def rightSideView(self, root):
        """
        :type root: TreeNode
        :rtype: List[int]
        """
        if root is None:
            return []
        current_level = [root]
        next_level = []
        result = []
        while current_level:
            result.append(current_level[-1].val)
            for node in current_level:
                next_level.extend(
                    [n for n in [node.left, node.right] if n is not None])
            current_level = next_level
            next_level = []
        return result


if __name__ == '__main__':
    print Solution().rightSideView(
        TreeNode.build_by_level_order([1, 2, 3, '#', 5, '#', 4]))
    print Solution().rightSideView(TreeNode.build_by_level_order([1]))
    print Solution().rightSideView(TreeNode.build_by_level_order(None))
示例#7
0
    def hasPathSum(self, root, sum):
        """
        :type root: TreeNode
        :type sum: int
        :rtype: bool
        """

        def path_sum(root, sum, accumulate_sum):
            assert root is not None
            accumulate_sum += root.val
            if root.left is None and root.right is None:
                return (accumulate_sum == sum)
            left_result = path_sum(root.left, sum, accumulate_sum) if root.left else False
            if left_result:
                return True
            right_result = path_sum(root.right, sum, accumulate_sum) if root.right else False
            return left_result or right_result

        return path_sum(root, sum, 0) if root else False


if __name__ == '__main__':
    t = TreeNode.build_by_level_order([5, 4, 8, 11, '#', 13, 4, 7, 2, '#', '#', '#', 1])
    print Solution().hasPathSum(t, 22)
    print Solution().hasPathSum(t, 15)
    print Solution().hasPathSum(t, 9)
    print Solution().hasPathSum(t, 13)
    print Solution().hasPathSum(t, 16)
    print Solution().hasPathSum(t, 26)
    print Solution().hasPathSum(t, 18)
        def in_order_tree(node):
            if node.left:
                for x in in_order_tree(node.left):
                    yield x
            yield node.val
            if node.right:
                for x in in_order_tree(node.right):
                    yield x
        if not root:
            return True
        old_value = None
        print list(in_order_tree(root))
        for val in in_order_tree(root):
            if not old_value:
                old_value = val
                continue
            if val <= old_value:
                return False
            old_value = val
        return True

if __name__ == '__main__':
    # print Solution().isValidBST(TreeNode.build_by_level_order([1, '#', 2, 3, '#']))
    # print Solution().isValidBST(TreeNode.build_by_level_order([2, 1, 3]))
    # print Solution().isValidBST(TreeNode.build_by_level_order([]))
    # print Solution().isValidBST(TreeNode.build_by_level_order([2]))
    # print Solution().isValidBST(TreeNode.build_by_level_order([10, 5, 15, '#', '#', 6, 20]))
    # print Solution().isValidBST(TreeNode.build_by_level_order([1, 1, '#']))
    # print Solution().isValidBST(TreeNode.build_by_level_order([0]))
    print Solution().isValidBST(TreeNode.build_by_level_order([0, '#', -1]))
示例#9
0
__author__ = 'clp'

from utils import TreeNode


class Solution(object):
    def invertTree(self, root):
        """
        :type root: TreeNode
        :rtype: TreeNode
        """
        def invert_tree(root):
            if root is None:
                return None
            root.left, root.right = root.right, root.left
            invert_tree(root.left)
            invert_tree(root.right)

        if root:
            invert_tree(root)
        return root


if __name__ == '__main__':
    TreeNode.print_in_level_order(Solution().invertTree(
        TreeNode.build_by_level_order([4, 2, 7, 1, '#', 6, 9])))
    TreeNode.print_in_level_order(Solution().invertTree(
        TreeNode.build_by_level_order([])))
class Solution(object):


    def minDepth(self, root):
        """
        :type root: TreeNode
        :rtype: int
        """

        def min_depth(root, level):
            if root.left is None and root.right is None:
                return level
            elif root.left is None:
                return min_depth(root.right, level+1)
            elif root.right is None:
                return min_depth(root.left, level+1)
            else:
                return min([min_depth(root.left, level+1), min_depth(root.right, level+1)])

        return min_depth(root, 1) if root else 0

if __name__ == '__main__':
    print Solution().minDepth(TreeNode.build_by_level_order([1, 2, 2, 3, 4, 4, 3]))
    print Solution().minDepth(TreeNode.build_by_level_order([1, 2, '#']))
    print Solution().minDepth(TreeNode.build_by_level_order([1, 2, 2, '#', 3, '#', 3]))
    print Solution().minDepth(TreeNode.build_by_level_order([1]))
    print Solution().minDepth(TreeNode.build_by_level_order([6,82,82,'#',53,53,'#',-58,'#','#',-58,'#',-85,-85,'#',-9,'#','#',-9,'#',48,48,'#',33,'#','#',33,81,'#','#',81,5,'#','#',5,61,'#','#',61,'#',9,9,'#',91,'#','#',91,72,7,7,72,89,'#',94,'#','#',94,'#',89,-27,'#',-30,36,36,-30,'#',-27,50,36,'#',-80,34,'#','#',34,-80,'#',36,50,18,'#','#',91,77,'#','#',95,95,'#','#',77,91,'#','#',18,-19,65,'#',94,'#',-53,'#',-29,-29,'#',-53,'#',94,'#',65,-19,-62,-15,-35,'#','#',-19,43,'#',-21,'#','#',-21,'#',43,-19,'#','#',-35,-15,-62,86,'#','#',-70,'#',19,'#',55,-79,'#','#',-96,-96,'#','#',-79,55,'#',19,'#',-70,'#','#',86,49,'#',25,'#',-19,'#','#',8,30,'#',82,-47,-47,82,'#',30,8,'#','#',-19,'#',25,'#',49]))
    print Solution().minDepth(TreeNode.build_by_level_order([2,3,3,4,5,'#',4]))
    print Solution().minDepth(TreeNode.build_by_level_order([2,3,3,4,5,'#','#']))
    print Solution().minDepth(TreeNode.build_by_level_order([2,3,3,4,5,5,4,'#','#',8,9,'#','#',9,8]))
__author__ = 'clp'

from utils import TreeNode

null = '#'


class Solution(object):
    def isBalanced(self, root):
        """
        :type root: TreeNode
        :rtype: bool
        """
        def op(root):
            if root == None:
                return 0, True

            left_depth, left_balance = op(root.left)
            right_depth, right_balance = op(root.right)
            return max(left_depth, right_depth) + 1, \
                   (left_balance and right_balance and (-1 <= left_depth - right_depth <= 1))

        return op(root)[1]


if __name__ == '__main__':
    print Solution().isBalanced(
        TreeNode.build_by_level_order([1, 2, 3, 4, null, null, null, 5]))
    print Solution().isBalanced(
        TreeNode.build_by_level_order([1, 2, 3, 4, null, null, null]))
__author__ = 'clp'

from utils import TreeNode

null = '#'

class Solution(object):

    def isBalanced(self, root):
        """
        :type root: TreeNode
        :rtype: bool
        """

        def op(root):
            if root == None:
                return 0, True

            left_depth, left_balance = op(root.left)
            right_depth, right_balance = op(root.right)
            return max(left_depth, right_depth) + 1, \
                   (left_balance and right_balance and (-1 <= left_depth - right_depth <= 1))

        return op(root)[1]

if __name__ == '__main__':
    print Solution().isBalanced(TreeNode.build_by_level_order([1, 2, 3, 4, null, null, null, 5]))
    print Solution().isBalanced(TreeNode.build_by_level_order([1, 2, 3, 4, null, null, null]))


class Solution(object):
    def maxDepth(self, root):
        """
        :type root: TreeNode
        :rtype: int
        """

        if root is None:
            return 0

        return max(self.maxDepth(root.left), self.maxDepth(root.right)) + 1


if __name__ == "__main__":
    print Solution().maxDepth(TreeNode.build_by_level_order([1, 2, 2, 3, 4, 4, 3]))
    print Solution().maxDepth(TreeNode.build_by_level_order([1, 2, "#"]))
    print Solution().maxDepth(TreeNode.build_by_level_order([1, 2, 2, "#", 3, "#", 3]))
    print Solution().maxDepth(TreeNode.build_by_level_order([1]))
    print Solution().maxDepth(
        TreeNode.build_by_level_order(
            [
                6,
                82,
                82,
                "#",
                53,
                53,
                "#",
                -58,
                "#",
示例#14
0
        """
        :type root: TreeNode
        :type sum: int
        :rtype: bool
        """
        def path_sum(root, sum, accumulate_sum):
            assert root is not None
            accumulate_sum += root.val
            if root.left is None and root.right is None:
                return (accumulate_sum == sum)
            left_result = path_sum(root.left, sum,
                                   accumulate_sum) if root.left else False
            if left_result:
                return True
            right_result = path_sum(root.right, sum,
                                    accumulate_sum) if root.right else False
            return left_result or right_result

        return path_sum(root, sum, 0) if root else False


if __name__ == '__main__':
    t = TreeNode.build_by_level_order(
        [5, 4, 8, 11, '#', 13, 4, 7, 2, '#', '#', '#', 1])
    print Solution().hasPathSum(t, 22)
    print Solution().hasPathSum(t, 15)
    print Solution().hasPathSum(t, 9)
    print Solution().hasPathSum(t, 13)
    print Solution().hasPathSum(t, 16)
    print Solution().hasPathSum(t, 26)
    print Solution().hasPathSum(t, 18)
示例#15
0
                for x in in_order_tree(node.left):
                    yield x
            yield node.val
            if node.right:
                for x in in_order_tree(node.right):
                    yield x

        if not root:
            return True
        old_value = None
        print list(in_order_tree(root))
        for val in in_order_tree(root):
            if not old_value:
                old_value = val
                continue
            if val <= old_value:
                return False
            old_value = val
        return True


if __name__ == '__main__':
    # print Solution().isValidBST(TreeNode.build_by_level_order([1, '#', 2, 3, '#']))
    # print Solution().isValidBST(TreeNode.build_by_level_order([2, 1, 3]))
    # print Solution().isValidBST(TreeNode.build_by_level_order([]))
    # print Solution().isValidBST(TreeNode.build_by_level_order([2]))
    # print Solution().isValidBST(TreeNode.build_by_level_order([10, 5, 15, '#', '#', 6, 20]))
    # print Solution().isValidBST(TreeNode.build_by_level_order([1, 1, '#']))
    # print Solution().isValidBST(TreeNode.build_by_level_order([0]))
    print Solution().isValidBST(TreeNode.build_by_level_order([0, '#', -1]))
        """
        :type root: TreeNode
        :rtype: List[List[int]]
        """
        if root is None:
            return []
        current_level = [root]
        next_level = []
        result = []
        while current_level:
            level_value_list = []
            for current_node in current_level:
                level_value_list.append(current_node.val)
                next_level.append(current_node.left) if current_node.left else None
                next_level.append(current_node.right) if current_node.right else None
            current_level = next_level
            next_level = []
            result.append(level_value_list)
        return result




if __name__ == '__main__':
    t = TreeNode.build_by_level_order([1,2,3,'#','#',4,'#','#',5])
    print Solution().levelOrder(t)
    TreeNode.print_in_level_order(t)
    t2 = TreeNode.build_by_level_order([3,9,20,'#','#',15,7])
    print Solution().levelOrder(t2)
    t3 = TreeNode.build_by_level_order([3])
    print Solution().levelOrder(t3)
示例#17
0
        """
        :type root: TreeNode
        :rtype: List[List[int]]
        """
        if root is None:
            return []
        current_level = [root]
        next_level = []
        result = []
        while current_level:
            level_value_list = []
            for current_node in current_level:
                level_value_list.append(current_node.val)
                next_level.append(
                    current_node.left) if current_node.left else None
                next_level.append(
                    current_node.right) if current_node.right else None
            current_level = next_level
            next_level = []
            result.append(level_value_list)
        return result


if __name__ == '__main__':
    t = TreeNode.build_by_level_order([1, 2, 3, '#', '#', 4, '#', '#', 5])
    print Solution().levelOrder(t)
    TreeNode.print_in_level_order(t)
    t2 = TreeNode.build_by_level_order([3, 9, 20, '#', '#', 15, 7])
    print Solution().levelOrder(t2)
    t3 = TreeNode.build_by_level_order([3])
    print Solution().levelOrder(t3)
from utils import TreeNode

class Solution(object):
    def sumNumbers(self, root):
        """
        :type root: TreeNode
        :rtype: int
        """
        if root is None:
            return 0
        current_level = [(root, 0)]
        s = 0
        while current_level:
            next_level = []
            for node, val in current_level:
                pivot = val * 10 + node.val
                if node.left:
                    next_level.append((node.left, pivot))
                if node.right:
                    next_level.append((node.right, pivot))
                if node.left == node.right == None:
                    s += pivot
            current_level = next_level
        return s


if __name__ == '__main__':
    print Solution().sumNumbers(TreeNode.build_by_level_order([1,2,3]))
    print Solution().sumNumbers(TreeNode.build_by_level_order([1]))

from utils import TreeNode

class Solution(object):
    def rightSideView(self, root):
        """
        :type root: TreeNode
        :rtype: List[int]
        """
        if root is None:
            return []
        current_level = [root]
        next_level = []
        result = []
        while current_level:
            result.append(current_level[-1].val)
            for node in current_level:
                next_level.extend([n for n in [node.left, node.right] if n is not None])
            current_level = next_level
            next_level = []
        return result

if __name__ == '__main__':
    print Solution().rightSideView(TreeNode.build_by_level_order([1, 2, 3, '#', 5, '#', 4]))
    print Solution().rightSideView(TreeNode.build_by_level_order([1]))
    print Solution().rightSideView(TreeNode.build_by_level_order(None))
from utils import TreeNode

class Solution(object):
    def kthSmallest(self, root, k):
        """
        :type root: TreeNode
        :type k: int
        :rtype: int
        """
        parent_stack = []
        node = root
        count = 0
        while parent_stack or node:
            if node:
                parent_stack.append(node)
                node = node.left
            else:
                node = parent_stack.pop()
                count += 1
                if count == k:
                    return node.val
                node = node.right

if __name__ == '__main__':
    print Solution().kthSmallest(TreeNode.build_by_level_order([2, 1, 3]), 2)
    print Solution().kthSmallest(TreeNode.build_by_level_order([2, 1, 3]), 4)
    print Solution().kthSmallest(None, 2)
    print Solution().kthSmallest(None, 4)
    print Solution().kthSmallest(None, 4)