https://leetcode.com/problems/sum-of-root-to-leaf-binary-numbers Easy

Условие

Дано бинарное дерево, в котором каждый узел содержит 0 или 1. Каждый корень до листа представляет собой двоичное число. Верните сумму всех таких чисел.

Примеры

Input: root = [1,0,1,0,1,0,1] Output: 22 Explanation: (100) + (101) + (110) + (111) = 4 + 5 + 6 + 7 = 22

Input: root = [0] Output: 0

Решение

/**
 * Example:
 * var ti = TreeNode(5)
 * var v = ti.`val`
 * Definition for a binary tree node.
 * class TreeNode(var `val`: Int) {
 *     var left: TreeNode? = null
 *     var right: TreeNode? = null
 * }
 */
 fun sumRootToLeaf(root: TreeNode?): Int {
    fun dfs(node: TreeNode?, sum: Int): Int {
        if (node == null) return 0
        
        // Формируем новое число, сдвигая текущую сумму влево и добавляя значение текущего узла
        val newSum = (sum shl 1) or node.`val`
        
        // Если узел листовой, возвращаем полученное число
        if (node.left == null && node.right == null) return newSum
        
        // Рекурсивно вычисляем сумму для левого и правого поддеревьев
        return dfs(node.left, newSum) + dfs(node.right, newSum)
    }
    
    return dfs(root, 0)
}

Временная сложность

O(n), так как посещаем каждый узел один раз.

Пространственная сложность

O(h), где h — высота дерева, из-за рекурсивного стека.