Рекурсия - это то, что трудно понять, начиная с программирования.Одна из вещей, которую вы должны осознать, это то, что, если вы правильно настроили базовые случаи (например, если self.left, self.right и т. Д.), Вы можете использовать функцию, над которой вы работаете, как если бы она былауже работает.
Давайте подумаем о примере подсчета всех узлов в дереве с помощью функции countNodes()
: скажем, у нас есть узел x, который находится где-то в дереве.Когда x вызывается для подсчета всех узлов его поддерева, как он это делает?Помните, как я сказал, что мы должны притвориться, что функция countNodes()
существует и что она уже работает?Что ж, давайте сделаем это.Х должен считать себя, потому что это узел.Следовательно, пока 1.После того, как он сосчитал сам, он должен сосчитать все узлы слева и все узлы справа.Таким образом, чтобы подсчитать узлы в дереве, начиная с любого узла x, мы вызываем countNodes () для левого и countNodes () для правого.
Таким образом, код будет выглядеть так:
def countNodes(self):
count = 1
if self.left: #Checking to see if we have a left subtree
count += countNodes(self.left)
if self.right: #Checking to see if we have a right subtree
count += countNodes(self.right)
return count
Итак, теперь, когда мы лучше понимаем рекурсию, давайте вернемся к вашему примеру.Мы хотим пройтись по дереву по предварительному заказу.По определению это означает, что мы должны сначала посетить наш узел.Затем мы видим, есть ли у нас левый узел для посещения.Если это так, мы пересекаем левые узлы в порядке предварительного заказа.Если у нас есть правильный узел, мы также просматриваем все это дерево в порядке предварительного заказа.
Крупнейшие выводы рекурсии:
Убедитесь, что у вас есть хорошие базовые случаи (например, если node.right == null)
Найти шаблон повторения.Вы можете использовать функцию в функции, как будто она уже построена, если у вас есть правильно работающие базовые случаи.
Надеюсь, это поможет!
Редактировать:
Чтобы объяснить ту часть себя, на которую я не смог ответить.Self представляет собой любой объект, называемый методом.Поэтому, если у нас есть узел x, с которым мы хотели бы выполнить предварительный обход, мы бы использовали x.preorder()
.Тогда в функции это будет выглядеть так:
def preorder(self): #self is whatever calls this function
print(self.value) #whaver you want to print
if self.left:
self.left.preorder() #now in this function call, self will be self.left
if self.right:
self.right.preorder() #same idea here
root.preorder() #calling the function. Now self will be root.
Надеюсь, это прояснит некоторые вещи для вас.Извините, что сначала не понял проблему.Я надеюсь, что это отвечает на это.Дайте мне знать, если у вас есть дополнительные вопросы или вам нужно больше разъяснений.