is a binary tree a sum tree where the value of every nonleaf node is equal to the sum of the values of its left and right subtrees https www geeksforgeeks orgcheckifagivenbinarytreeissumtree root node2 listroot 2 root left node1 tupleroot 1 2 root node2 lenroot 1 root left node1 lenroot 2 root node3 root issumnode true root left node1 root issumnode false root right node2 root issumnode true listbinarytree buildatree 1 2 7 11 15 29 35 40 lenbinarytree buildatree 8 returns a string representation of the inorder traversal of the binary tree strlistbinarytree buildatree 1 2 7 11 15 29 35 40 binarytree buildatree issumtree false binarytree buildasumtree issumtree true tree binarytreenode11 root tree root root left node2 root right node29 root left left node1 root left right node7 root right left node15 root right right node40 root right right left node35 return tree classmethod def buildasumtreecls binarytree r create a binary tree with the specified structure 26 10 3 4 6 3 listbinarytree buildasumtree 4 10 6 26 3 3 root node 2 list root 2 root left node 1 tuple root 1 2 root node 2 len root 1 root left node 1 len root 2 root node 3 root is_sum_node true root left node 1 root is_sum_node false root right node 2 root is_sum_node true leaf nodes are considered sum nodes list binarytree build_a_tree 1 2 7 11 15 29 35 40 len binarytree build_a_tree 8 returns a string representation of the inorder traversal of the binary tree str list binarytree build_a_tree 1 2 7 11 15 29 35 40 binarytree build_a_tree is_sum_tree false binarytree build_a_sum_tree is_sum_tree true create a binary tree with the specified structure 11 2 29 1 7 15 40 35 list binarytree build_a_tree 1 2 7 11 15 29 35 40 create a binary tree with the specified structure 26 10 3 4 6 3 list binarytree build_a_sum_tree 4 10 6 26 3 3
from __future__ import annotations

from collections.abc import Iterator
from dataclasses import dataclass


@dataclass
class Node:
    data: int
    left: Node | None = None
    right: Node | None = None

    def __iter__(self) -> Iterator[int]:
        
        if self.left:
            yield from self.left
        yield self.data
        if self.right:
            yield from self.right

    def __len__(self) -> int:
        
        return sum(1 for _ in self)

    @property
    def is_sum_node(self) -> bool:
        
        if not self.left and not self.right:
            return True  
        left_sum = sum(self.left) if self.left else 0
        right_sum = sum(self.right) if self.right else 0
        return all(
            (
                self.data == left_sum + right_sum,
                self.left.is_sum_node if self.left else True,
                self.right.is_sum_node if self.right else True,
            )
        )


@dataclass
class BinaryTree:
    root: Node

    def __iter__(self) -> Iterator[int]:
        
        return iter(self.root)

    def __len__(self) -> int:
        
        return len(self.root)

    def __str__(self) -> str:
        
        return str(list(self))

    @property
    def is_sum_tree(self) -> bool:
        
        return self.root.is_sum_node

    @classmethod
    def build_a_tree(cls) -> BinaryTree:
        r
        tree = BinaryTree(Node(11))
        root = tree.root
        root.left = Node(2)
        root.right = Node(29)
        root.left.left = Node(1)
        root.left.right = Node(7)
        root.right.left = Node(15)
        root.right.right = Node(40)
        root.right.right.left = Node(35)
        return tree

    @classmethod
    def build_a_sum_tree(cls) -> BinaryTree:
        r
        tree = BinaryTree(Node(26))
        root = tree.root
        root.left = Node(10)
        root.right = Node(3)
        root.left.left = Node(4)
        root.left.right = Node(6)
        root.right.right = Node(3)
        return tree


if __name__ == "__main__":
    from doctest import testmod

    testmod()
    tree = BinaryTree.build_a_tree()
    print(f"{tree} has {len(tree)} nodes and {tree.is_sum_tree = }.")
    tree = BinaryTree.build_a_sum_tree()
    print(f"{tree} has {len(tree)} nodes and {tree.is_sum_tree = }.")