Рубрики
Без рубрики

LeetCode в день – сумма левых листьев

LeetCode Daily – 24 августа, 2020 г. Сумма левых листьев ссылается на вопрос летекода … Теги с Python, CodeNewie, Challenge.

Сумма левых листьев

Ссылка на вопрос летакода

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

Тем не менее, поскольку многие люди публикуют свои собственные решения в раздел дискуссий IETCODE, я не обязательно буду публиковать оптимальное решение.

Вопрос

( Копия вставлена из лецкода)

Найдите сумму всех левых листьев в данном двоичном дереве.

Пример:

    3
   / \
  9  20
    /  \
   15   7

There are two left leaves in the binary tree, with values 9 and 15 respectively. Return 24.

Мой подход (ES)

Я не буду преодолевать весь код для всех попыток, но я объясню свой подход (ы) качественно.

Попытка 1 – DFS

(Представлено – принято)

Когда я вижу такую проблему дерева, как это, мой Go-to DF или BFS (я обычно начинаю с DFS по умолчанию), и я склонен использовать стек (вы можете использовать рекурсию).

Принцип – просто проверять каждый узел, чтобы найти узлы, которые:

  • Листья
  • Были слева от их родителей

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

Единственная дополнительная вещь, которую мне действительно нужна, – это структура данных, которая сообщает текущий узел, если он был влево или право его родителя (или рут, если он является корнем).

Я реализовал это с помощью словаря (в Python), который хранит узел и тип «NTYPE» или NODE. Тип узла в настоящее время либо «root», «вправо» или «влево». Я покинул тип в виде строки для целей быстрого представления кода, но может использоваться enum, поскольку данные могут быть только одним из возможных наборов.

Представленный код (Python):

class Solution(object):
    def sumOfLeftLeaves(self, root):

        if root == None:
            return 0
        result = 0 
        stack = [{'node': root, 'nType': 'root'}]

        # dfs using a stack 
        # add to result if left and a leaf 
        # should add an additional data, whether it was left or right or root
        while len(stack) > 0:
            curr = stack.pop() 
            currNode = curr['node']
            currType = curr['nType']

            # check if leaf 
            if currNode.left == None and currNode.right == None and currType == 'left':
                result += currNode.val

            # add children to tree 
            if currNode.left != None:
                stack.append({'node': currNode.left, 'nType': 'left'})

            if currNode.right != None:
                stack.append({'node': currNode.right, 'nType': 'right'})

        # end of while loop
        return result 

Обсуждение и выводы

Как уже упоминалось в разделе «Подход», лучшая структура данных, такая как enum, может использоваться для хранения состояния текущего узла. Но моя главная забота о оптимизации производительности заключается в том, могу ли я постоянно искать меньше, чем O (n) (где n – количество узлов в дереве) узлов.

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

Оригинал: “https://dev.to/drewhsu86/leetcode-daily-sum-of-left-leaves-17k8”