Python сохраняет изменения в параметре функции без возврата (leetcode: «Не возвращайте ничего, вместо этого измените root на месте») - PullRequest
0 голосов
/ 07 октября 2019

когда я решу эту проблему Я должен разобраться с их требованием "Не возвращайте ничего, вместо этого измените root на месте". В моем подходе к решению этой проблемы кажется, что их средство проверки не увидит каких-либо изменений, внесенных в «root» после вызова функции «flatten (self, root: TreeNode)». Я пытался распечатать новое двоичное дерево перед выходом из функции, и оно кажется правильным. enter image description here Проблема в том, что, в отличие от c ++, где простой «&» хранит изменения в параметре, Python, похоже, не сохраняет изменения, так как я могу удовлетворить «Не возвращать ничего»? Пожалуйста, помогите мне, мне нужно много тренироваться на python для собеседования, и я понятия не имею, как решить эту проблему.


https://leetcode.com/problems/flatten-binary-tree-to-linked-list/

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:

    def flatten(self, root: TreeNode) -> None:
        """
        Do not return anything, modify root in-place instead.
        """

        # get tree in preorder traverse
        preordered = []
        def preorder(root):
            if root is not None:
                preordered.append(root.val)
                preorder(root.left)
                preorder(root.right)
        preorder(root) # for [1,2,5,3,4,null,6] creted preordered list as [1, 2, 3, 4, 5, 6] so it s ok


        # construct a new tree with only right childs, from preordered list 
        root = TreeNode(preordered[0])
        next_root = root
        for i in range(1, len(preordered)):
            new = TreeNode(preordered[i])
            next_root.right= new
            next_root = new
        # it seems that root won t take change on checker and stays like how it was called  

1 Ответ

0 голосов
/ 08 октября 2019

Таким образом, это означает, что я могу только изменить предыдущее дерево, а не оставлять корень или создать другое и назначить ему корень [sic]

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

    root = TreeNode(preordered[0])

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

Вместо этого ограничьте себя операциями, которые работают сатрибуты root, такие как

root.right = <expr>

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

...