План курса / Все задачи / Алгоритмы и структуры данных
Сумма правых листьев дерева
легко
# решено
Дан корень бинарного дерева. Нужно вернуть сумму всех правых листьев в дереве. Если правых листьев нет, то нужно вернуть ноль
ВАЖНО: реши задачу с использованием рекурсии
Пример 1:
Ввод: root = [1,2,3,4,5,null,6,null,null,7,8]
Вывод: 14
Объяснение: в дереве 2 правых листа со значениями [8,6], а их сумма 14
Пример 2:
Ввод: root = [10]
Вывод: 0
Объяснение: корень дерева не является ни правой, ни левой вершиной
Ограничения:
Число узлов в дереве >= 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;
}
private static int Traversal(TreeNode node, bool isRight)
{
// если вершина пустая, то возвращаем 0
if (node == null)
{
return 0;
}
// если вершина - ПРАВЫЙ лист, то возвращаем ее значение
if (IsLeaf(node) && isRight)
{
return node.val;
}
// если вершина не лист - возвращаем сумму ПРАВЫХ листов из левого и правого поддерева
return Traversal(node.left, false) + Traversal(node.right, true);
}
public static int SumOfRightLeaves(TreeNode root)
{
// корень не является ни левым, ни правым листом, поэтому для корня передаем false
return Traversal(root, false);
}
}
#include <vector>
using namespace std;
/**
* 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 traversal(TreeNode* node, bool isRight) {
// если вершина пустая, то возвращаем 0
if (node == nullptr) {
return 0;
}
// если вершина - ПРАВЫЙ лист, то возвращаем ее значение
if (isLeaf(node) && isRight) {
return node->val;
}
// если вершина не лист - возвращаем сумму ПРАВЫХ листов из левого и правого поддерева
return traversal(node->left, false) + traversal(node->right, true);
}
int sumOfRightLeaves(TreeNode* root) {
// корень не является ни левым, ни правым листом, поэтому для корня передаем false
return traversal(root, false);
}
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 traversal(node *TreeNode, isRight bool) int {
// если вершина пустая, то возвращаем 0
if node == nil {
return 0
}
// если вершина - ПРАВЫЙ лист, то возвращаем ее значение
if isLeaf(node) && isRight {
return node.Val
}
// если вершина не лист - возвращаем сумму ПРАВЫХ листов из левого и правого поддерева
return traversal(node.Left, false) + traversal(node.Right, true)
}
func sumOfRightLeaves(root *TreeNode) int {
// корень не является ни левым, ни правым листом, поэтому для корня передаем false
return traversal(root, false)
}
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;
}
private int traversal(TreeNode node, boolean isRight) {
// если вершина пустая, то возвращаем 0
if (node == null) {
return 0;
}
// если вершина - ПРАВЫЙ лист, то возвращаем ее значение
if (isLeaf(node) && isRight) {
return node.val;
}
// если вершина не лист, возвращаем сумму ПРАВЫХ листов из левого и правого поддерева
return traversal(node.left, false) + traversal(node.right, true);
}
public int sumOfRightLeaves(TreeNode root) {
// корень не является ни левым, ни правым листом, поэтому для корня передаем false
return traversal(root, false);
}
}
from tree_node import TreeNode
# class TreeNode:
# def __init__(self, val, 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 traversal(node: TreeNode, isRight: bool) -> int:
# если вершина пустая, то возвращаем 0
if node is None:
return 0
# если вершина - ПРАВЫЙ лист, то возвращаем ее значение
if is_leaf(node) and isRight:
return node.val
# если вершина не лист - возвращаем сумму ПРАВЫХ листов из левого и правого поддерева
return traversal(node.left, False) + traversal(node.right, True)
def sum_of_right_leaves(root: TreeNode) -> int:
# корень не является ни левым, ни правым листом, поэтому для корня передаем false
return traversal(root, False)
/*
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 traversal(node, isRight) {
// если вершина пустая, то возвращаем 0
if (node === null) {
return 0;
}
// если вершина - ПРАВЫЙ лист, то возвращаем ее значение
if (isLeaf(node) && isRight) {
return node.val;
}
// если вершина не лист - возвращаем сумму ПРАВЫХ листов из левого и правого поддерева
return traversal(node.left, false) + traversal(node.right, true);
}
export function sumOfRightLeaves(root) {
// корень не является ни левым, ни правым листом, поэтому для корня передаем false
return traversal(root, false);
}