Бинарное дерево сумма листьев

Сумма значений листьев бинарного дерева

Я написал этот код, и когда я использую печать, я вижу, что я получаю листья. Однако окончательный результат возврата из функции None , а не сумма листьев, которая в этом примере должна быть 7 . Я был бы рад узнать, что здесь не так. Спасибо !

class Node: def __init__(self, val=None): self.left = None self.right = None self.val = val def sum_leafs(tree): if tree is None: return 0 if tree.right and tree.left: sum_leafs(tree.right) sum_leafs(tree.left) elif tree.right or tree.left: if tree.right: sum_leafs(tree.right) elif tree.left: sum_leafs(tree.left) elif tree.right is None and tree.left is None: return sum_leafs(tree.left) + 1 node = Node(10) node.right = Node(2) node.left = Node(11) node.left.right = Node(5) print(sum_leafs(node)) 

4 ответа

Вы забыли добавить + при суммировании ветвей (влево / вправо), а также забыли получить доступ к val , что наиболее важно для всей работы.

Далее логика может быть упрощена:

def sum_leafs(tree): if tree is None: return 0 if not tree.right and not tree.left: return tree.val return sum_leafs(tree.right) + sum_leafs(tree.left) 

Вы не возвращаете правильно рассчитанные суммы листьев. Попробуй это:

class Node: def __init__(self, val=None): self.left = None self.right = None self.val = val def sum_leafs(tree): if tree is None: return 0 elif tree.right and tree.left: return sum_leafs(tree.right) + sum_leafs(tree.left) elif tree.right or tree.left: if tree.right: return sum_leafs(tree.right) elif tree.left: return sum_leafs(tree.left) elif tree.right is None and tree.left is None: return tree.val node = Node(10) node.right = Node(2) node.left = Node(11) node.left.right = Node(5) print(sum_leafs(node)) 

Вы не складываете суммы и не возвращаете их. Это также можно сделать с помощью метода в классе:

class Node: def __init__(self, val=None): self.left = None self.right = None self.val = val def sum(self): s = 0 if self.left is not None: s += self.left.sum() if self.right is not None: s += self.right.sum() return self.val + s node = Node(10) node.right = Node(2) node.left = Node(11) node.left.right = Node(5) print(node.sum()) 

Сначала я собираюсь обновить интерфейс Node , чтобы при создании узлов можно было установить ветви left и right .

class Node: def __init__(self, val=None, left=None, right=None): self.left = left self.right = right self.val = val 

Это позволяет нам создавать тресс более эргономично, например:

t = Node(10, Node(11, None, Node(5)), Node(2)) 

Теперь мы напишем общую процедуру обхода. Это позволяет нам отделить 1) обход нашего дерева от 2) предполагаемой операции, которую мы хотим выполнить с каждым элементом дерева —

def traverse(tree): if tree is None: return else: yield tree.val yield from traverse(tree.left) yield from traverse(tree.right) 

Теперь sum_leafs может быть простой программой. Ему больше не нужно заниматься обходом дерева, и вместо этого он может сосредоточиться на преобразовании линейной последовательности значений в желаемую сумму —

def sum_leafs(tree): r = 0 for val in traverse(tree): r += val return r print(sum_leafs(t)) # 28 

Или вместо суммирования значений мы могли бы написать функцию search , чтобы найти первое значение, которое передает предикат —

def search(test, tree): for val in traverse(tree): if test(val): return val print(search(lambda x: x < 10, t)) # 5 print(search(lambda x: x >99, t)) # None 

Или мы могли бы просто собрать каждое значение в список —

print(list(traverse(t))) # [ 10, 11, 5, 2 ] 

Как видите, удаление логики обхода из каждой функции, которая зависит от нашего дерева, может быть огромной помощью.

Читайте также:  Деревья цветущие весной розовым цветом

Если вам не нравятся генераторы, вы можете написать нетерпеливую версию traverse , которая всегда возвращает list . Разница сейчас в том, что нет возможности частично пройти по дереву. Обратите внимание на сходство этой программы с версией генератора —

def traverse(tree): if tree is None: return [] #  

Источник

Найдите путь максимальной суммы между двумя листьями в бинарном дереве.

Для заданного бинарного дерева напишите эффективный алгоритм нахождения максимальной суммы пути между любыми двумя его листьями. Предположим, что бинарное дерево не асимметрично и содержит не менее двух узлов.

Например, максимальный суммарный путь в следующем бинарном дереве равен 22:

Maximum Sum Path

Простым решением было бы вычислить максимальную сумму пути от узла к листу от левого и правого дочерних элементов для каждого узла в дереве. Максимальный суммарный путь между двумя листьями, который проходит через узел, имеет значение, равное максимальной сумме пути от узла к листу его левого и правого дочерних элементов плюс значение узла. Наконец, рассмотрим максимальное значение среди всех путей с максимальной суммой, найденных для каждого узла в дереве.

Временная сложность этого решения O(n 2 ) как есть n узлов в дереве, и для каждого узла мы вычисляем максимальную сумму пути от узла к листу его левого и правого поддерева, который занимает O(n) время.

Мы можем решить эту задачу за линейное время, обходя дерево снизу вверх. Вместо вычисления максимального суммарного пути от узла к листу левого и правого дочерних элементов для каждого узла в дереве вычислите максимальный суммарный путь между двумя листьями, который проходит через узел за постоянное время. Идея состоит в том, чтобы начать с нижней части дерева и вернуть максимальную сумму пути от узла к листу для каждого узла до его родителя.

Алгоритм может быть реализован следующим образом на C++, Java и Python. Здесь мы передаем путь максимальной суммы по ссылке на функцию (вместо того, чтобы возвращать ее) и обновляем его значение внутри самой функции, используя возвращаемое значение левого и правого поддеревьев.

Источник

Бинарное дерево. Сумма листьев на последнем уровне

Здравствуйте, мне нужно сделать данное задание: Дано бинарное дерево, необходимо вернуть сумму всех его листьев на самом глубоком уровне.

Это не совсем рабочее решение с поиском глубины

1 2 3 4 5 6 7 8 9 10 11 12 13 14
-- Дано бинарное дерево, необходимо вернуть сумму всех его листьев на самом глубоком уровне. data Tree a = EmptyTree | Node a (Tree a) (Tree a) deriving ( Show, Read, Eq ) -- Returns the Depth of a binary tree treeDepth :: Tree a -> Int treeDepth EmptyTree = 0 treeDepth (Node _ leftBranch rightBranch) = 1 + max (treeDepth leftBranch) (treeDepth rightBranch) -- If Depth = max depth then +x, else +0 sumOfDeepest :: Int a -> Num a => Tree a -> a sumOfDeepest _ EmptyTree = 0 sumOfDeepest depth (Node x left right) = if (depth == treeDepth Tree a) then x + (sumOfDeepest depth left) + (sumOfDeepest depth right) else 0 + (sumOfDeepest depth left) + (sumOfDeepest depth right)

Дано целочисленное бинарное дерево. Найти количество листьев дерева, находящихся на n-м уровне
//Дано целочисленное бинарное дерево. //Найти количество листьев дерева, находящихся на n-м уровне.

Подсчитать количество листьев дерева не на последнем уровне, имеющем листья.
Добрый день! Не могу разобраться со следующим: нужно подсчитать количество листьев не на последнем.

Бинарное дерево поиска. Сумма "листьев"
Доброго времени суток. Суть задачи состоит в том, чтобы посчитать сумму элементов, находящих на.

Бинарное дерево: посчитать количество листьев
Нужно построить бинарное дерево типа *char. В этом бинарном дереве найти количество листьев.

Эксперт функциональных языков программированияЭксперт Python

Преобразуем дерево в список пар (значение, уровень). Дальше задача сводится к спискам.

1 2 3 4 5 6 7 8 9 10 11 12 13 14
data Tree a = Empty | Node a (Tree a) (Tree a) deriving ( Show, Read, Eq ) tree2arr :: (Num a) => Tree a -> Int -> [(a,Int)] tree2arr Empty n = [(0,n)] tree2arr (Node x left right) n = (x,n):(tree2arr left (n+1))++(tree2arr right (n+1)) sumlev :: (Num a) => [(a,Int)] -> a sumlev xs = sum $ map fst $ filter (\ (s,l) -> l==ml) xs where ml = (maximum $ map snd xs)-1 task t = sumlev $ tree2arr t 0 main = print $ task (Node 111 (Node 222 Empty Empty) (Node 666 Empty (Node 777 Empty Empty) ))
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
 data Tree a = Empty | Node a (Tree a) (Tree a) deriving ( Show, Read, Eq ) sumOfDeepest :: Num a => Tree a -> a sumOfDeepest tree = byLvl [] [tree] where byLvl p t = case concatMap (\case Node _ l r -> [l,r] _ -> []) t of [] -> foldr (\n s -> case n of Node v _ _ -> s+v _ -> s) 0 p nxt -> byLvl t nxt main :: IO () main = do let testdata = (Node 111 (Node 222 Empty (Node 333 Empty (Node 444 Empty Empty))) (Node 555 Empty (Node 666 (Node 777 Empty Empty) Empty))) :: Tree Int print $ sumOfDeepest testdata

Бинарное дерево: найти количество листьев
Нужно написать функцию, которая находит количество листьев в бинарном дереве

Можно ли заполнить бинарное дерево, начиная с листьев?
По заданию нужно вывести на экран своеобразную турнирную таблицу: вводятся 2^n имен команд, они.

Сформировать бинарное дерево, посчитать количество листьев
помогите написать программу,можно и с использованием классов. сформировать бинарное дерево.

Бинарное дерево, число вершин на n уровне
Почему выводится неверное кол-во узлов дерева? Помогите найти, что неверно. По заданию: Подсчитать.

Построить и вывести бинарное дерево, степень всех вершин которого, кроме листьев, равна введенному числу
Построить и вывести бинарное дерево, степень всех вершин которого, кроме листьев, равна введенному.

Источник

Бинарное дерево поиска. Сумма "листьев"

Доброго времени суток.
Суть задачи состоит в том, чтобы посчитать сумму элементов, находящих на "листочках" дерева.
Никак не дойдет, как реализацию в main написать.
Функции создания дерева и поиска по дереву есть. Но как эту сумму реализовать?!
Заранее благодарю)

Бинарное дерево поиска: "Библиотека", поиск по автору книги
Есть бинарное дерево поиска.Дерево представляет собой подобие библиотеки.Нужно осуществить поиск по.

Классы "Бинарное дерево" и "Узел" в одном приложении
Компилятор разбушевался((( Пробовала сделать вместо одного класса два класса(Дерево и узел).

Исходное бинарное дерево превратить в бинарное дерево поиска, при этом сохранив его структуру
Помогите, не могу понять!( Нужно исходное бинарное дерево превратить в бинарное дерево поиска, при.

Шаблон класса "Бинарное дерево" с насследованием
Здравствуйте! Есть задание сделать шаблон класса "Бинарное дерево". #include <iostream>.

Лучший ответ

Сообщение было отмечено Maria64 как решение

Решение

int summ(node *elem) { return 1 + (elem->left ? summ(elem->left) : 0) + (elem->right ? summ(elem->right)); }

Бинарное дерево (связный список "сыновей")
Здравствуйте, помогите, пожалуйста, с программой.Нужно реализовать бинарное дерево, представленное.

Бинарное дерево: посчитать количество листьев
Нужно построить бинарное дерево типа *char. В этом бинарном дереве найти количество листьев.

Бинарное дерево: найти количество листьев
Нужно написать функцию, которая находит количество листьев в бинарном дереве

Сформировать бинарное дерево, посчитать количество листьев
помогите написать программу,можно и с использованием классов. сформировать бинарное дерево.

Спор с педагогом, рассудите "Двоичное дерево поиска"
Двоичное дерево поиска Спор у нас на том, что: Если значение одинаково в дереве, то оно исчезает.

Чтения структуры из файла (описать структуру с именем "ORDER": "счет плательщика"; "счет получателя"; "сумма, переводится банковской операцией")
Описать структуру с именем "ORDER", содержащий следующие поля: "Счет плательщика"; "Счет.

Источник

Оцените статью