https://leetcode.com/problems/sum-of-root-to-leaf-binary-numbers | Easy |
---|
Дано бинарное дерево, в котором каждый узел содержит 0
или 1
. Каждый корень до листа представляет собой двоичное число. Верните сумму всех таких чисел.
Input:
root = [1,0,1,0,1,0,1]Output:
22Explanation:
(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
— высота дерева, из-за рекурсивного стека.