План курса / Все задачи / Алгоритмы и структуры данных
Сумма листьев в дереве
легко
# решено
Дан корень бинарного дерева. Нужно вернуть сумму всех листьев в дереве
ВАЖНО: реши задачу с использованием рекурсии
Пример 1:
Ввод: root = [1,2,3,4,5,null,6,null,null,7,8]
Вывод: 25
Объяснение: В дереве 4 листа со значениями [4,7,8,6], а их сумма 25
Пример 2:
Ввод: root = [10]
Вывод: 10
Ограничения:
Число узлов в дереве >= 1
Высота дерева <= 1000
Значение вершин дерева лежит в диапазоне [-10 000, 10 000] (включительно)
/**
* public class TreeNode {
* public int val;
* public TreeNode left;
* public TreeNode right;
* public TreeNode(int val, TreeNode left=null, TreeNode right=null) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
public class Solution
{
// возвращаем true если node - лист и false если не лист
private static bool IsLeaf(TreeNode node)
{
// вершина - лист, если левый и правый ребенок отсутствуют
return node.left == null && node.right == null;
}
public static int LeavesSum(TreeNode root)
{
// если вершина - пустая, то возвращаем 0
if (root == null)
{
return 0;
}
// если вершина - лист, то возвращаем ее значение
if (IsLeaf(root))
{
return root.val;
}
// если вершина не лист - возвращаем сумму листов из левого и правого поддерева
return LeavesSum(root.left) + LeavesSum(root.right);
}
}
/**
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* };
*/
// возвращаем true если node - лист и false если не лист
bool isLeaf(TreeNode* node) {
// вершина - лист, если левый и правый ребенок отсутствуют
return node->left == nullptr && node->right == nullptr;
}
int leavesSum(TreeNode* root) {
// если вершина - пустая, то возвращаем 0
if (root == nullptr) {
return 0;
}
// если вершина - лист, то возвращаем ее значение
if (isLeaf(root)) {
return root->val;
}
// если вершина не лист - возвращаем сумму листов из левого и правого поддерева
return leavesSum(root->left) + leavesSum(root->right);
}
package main
// type TreeNode struct {
// Val int
// Left *TreeNode
// Right *TreeNode
// }
// возвращаем true если node - лист и false если не лист
func isLeaf(node *TreeNode) bool {
// вершина - лист, если левый и правый ребенок отсутствуют
return node.Left == nil && node.Right == nil
}
func leavesSum(root *TreeNode) int {
// если вершина - пустая, то возвращаем 0
if root == nil {
return 0
}
// если вершина - лист, то возвращаем ее значение
if isLeaf(root) {
return root.Val
}
// если вершина не лист - возвращаем сумму листов из левого и правого поддерева
return leavesSum(root.Left) + leavesSum(root.Right)
}
import java.util.*;
// class TreeNode {
// int val;
// TreeNode left, right;
// public TreeNode(int value) {
// this.val = value;
// this.left = this.right = null;
// }
// }
class Solution {
// возвращаем true если node - лист и false если не лист
private boolean isLeaf(TreeNode node) {
// вершина - лист, если левый и правый ребенок отсутствуют
return node.left == null && node.right == null;
}
public int leavesSum(TreeNode root) {
// если вершина - пустая, то возвращаем 0
if (root == null) {
return 0;
}
// если вершина - лист, то возвращаем ее значение
if (isLeaf(root)) {
return root.val;
}
// если вершина не лист - возвращаем сумму листов из левого и правого поддерева
return leavesSum(root.left) + leavesSum(root.right);
}
}
from typing import *
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
# возвращаем True если node - лист и False если не лист
def is_leaf(node: TreeNode) -> bool:
# вершина - лист, если левый и правый ребенок отсутствуют
return node.left is None and node.right is None
def leaves_sum(root: Optional[TreeNode]) -> int:
# если вершина - пустая, то возвращаем 0
if root is None:
return 0
# если вершина - лист, то возвращаем ее значение
if is_leaf(root):
return root.val
# если вершина не лист - возвращаем сумму листов из левого и правого поддерева
return leaves_sum(root.left) + leaves_sum(root.right)
/*
class TreeNode {
constructor(value) {
this.val = value;
this.left = null;
this.right = null;
}
}
*/
// возвращаем true если node - лист и false если не лист
export function isLeaf(node) {
// вершина - лист, если левый и правый ребенок отсутствуют
return node.left === null && node.right === null;
}
export function leavesSum(root) {
// если вершина - пустая, то возвращаем 0
if (root === null) {
return 0;
}
// если вершина - лист, то возвращаем ее значение
if (isLeaf(root)) {
return root.val;
}
// если вершина не лист - возвращаем сумму листов из левого и правого поддерева
return leavesSum(root.left) + leavesSum(root.right);
}
Оценка сложности
Время: O(n), где n - число вершин в дереве
Память: O(h), где n - число вершин в дереве; h - высота дерева