Почему при вызове этого метода я получаю None? - PullRequest
0 голосов
/ 16 июня 2020

Я хочу написать метод mirror(), который создает и возвращает двоичное дерево, в котором все левые поддеревья становятся правыми поддеревьями и наоборот. Я пытался сделать это с помощью рекурсии:

def mirror(self):
    if self.left == None and self.right == None:
        return
    elif self.left == None and self.right != None:
        t = self.right
        self.right = self.left
        self.left = t
        self.left.mirror()
    elif self.left != None and self.right == None:
        t = self.right
        self.right = self.left
        self.left = t
        self.right.mirror()
    else:
        t = self.right
        self.right = self.left
        self.left = t
        self.left.mirror()
        self.right.mirror()

Но получаю результат None. Почему и как это исправить?

1 Ответ

1 голос
/ 16 июня 2020

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

<code>def mirror(self):
    if self.left == None and self.right == None:
        <b>pass</b>
    elif self.left == None and self.right != None:
        t = self.right
        self.right = self.left
        self.left = t
        self.left.mirror()
    elif self.left != None and self.right == None:
        t = self.right
        self.right = self.left
        self.left = t
        self.right.mirror()
    else:
        t = self.right
        self.right = self.left
        self.left = t
        self.left.mirror()
        self.right.mirror()
    <b>return self</b>

или проще:

def mirror(self):
    if self.left is not None:
        self.left.mirror()
    if self.right is not None:
        self.right.mirror()
    self.left, self.right = self.right, self.left
    return self

Если, с другой стороны , вам нужно новое дерево, независимое от исходного дерева, вам нужно построить его для возврата.

def mirror(self):
    new_tree = ...  # Whatever you do to create a root node from the root of self

    # If the child pointers aren't already None after creating the node
    new_tree.left = None
    new_tree.right = None

    if self.right is not None:
        new_tree.left = self.right.mirror()
    if self.left is not None:
        new_tree.right = self.left.mirror()

    return new_tree
...