Не удается понять однострочный код в решении Leetcode 250 - PullRequest
0 голосов
/ 30 июня 2019

У меня проблемы с пониманием решения в LeetCode 250. Вопросы: «Если задано двоичное дерево, подсчитайте количество поддеревьев uni-value. Поддерево Uni-value означает, что все узлы поддерева имеют одинаковое значение». Ссылка на вопрос https://leetcode.com/problems/count-univalue-subtrees/.

Я приложил решение. Я не могу понять код. Что означает эта строка?

is_uni = self.is_uni(node.left) and is_uni and node.left.val == node.val

Полное решение -

class Solution:
def countUnivalSubtrees(self, root):
    if root is None: return 0
    self.count = 0
    self.is_uni(root)
    return self.count

def is_uni(self, node):
    if node.left is None and node.right is None:
        self.count += 1
        return True
    is_uni = True
    if node.left:
        is_uni = self.is_uni(node.left) and is_uni and node.left.val == node.val
    if node.right:
        is_uni = self.is_uni(node.right) and is_uni and node.right.val == node.val
    self.count += is_uni
    return is_uni

1 Ответ

0 голосов
/ 01 июля 2019

Итак, строка кода, которую вы упомянули, а именно

is_uni = self.is_uni(node.left) and is_uni and node.left.val == node.val

Эта строка кода рекурсивно вызывает функцию-член класса is_uni() (self.some_member_function() - это синтаксис, который python использует для доступа к переменным-членам и функциям текущего экземпляра класса. Он похож на оператор this в C, C ++ и т. д.), и логика этой строки заключается в том, что вы хотите проверить, является ли левое поддерево с корнем в node.left деревом унивальных значений и что значение is_uni равно True и что значение левого узла node.left.val совпадает с узлом текущего проверяемого node.

Теперь эта логика будет повторяться до тех пор, пока вы не достигнете конца левого поддерева с корнем в node.left. Аналогичная логика для проверки, является ли правое поддерево с корнем в node.right деревом однозначных значений и что его значение node.right.val совпадает с текущим node. Эти 2 рекурсивных вызова инициируются до тех пор, пока не будут проверены все узлы дерева.

Надеюсь, это поможет! Если вам нужны дополнительные разъяснения, дайте мне знать в комментариях.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...