class Node:

    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right


def max_subtree_sum_binary(root):
    max_sum = float("-inf")

    def dfs(node):
        nonlocal max_sum
        if not node:
            return 0

        current_sum = node.val + dfs(node.left) + dfs(node.right)
        max_sum = max(max_sum, current_sum)
        return current_sum

    dfs(root)
    return max_sum


if __name__ == "__main__":
    root = Node(10)
    root.left = Node(5)
    root.right = Node(-3)
    root.left.left = Node(3)
    root.left.right = Node(2)
    root.right.right = Node(11)

    print("Maximum Subtree Sum:", max_subtree_sum_binary(root))