2016-02-04 18 views
0

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

def getPath(self, target): 

    stack = [] 

    def _getPath(head): 
     nonlocal stack 
     nonlocal target 

     stack.append(head) 

     if head.value == target: 
      return stack 
     if head.left is not None: 
      _getPath(head.left) 
     if head.right is not None: 
      _getPath(head.right) 

    _getPath(self.root) 

    return stack 

В настоящее время стек будет содержать все элементы в дереве.

+0

В списках есть метод 'pop()', вы попробовали? Поп-элементы из него ... –

+0

@JeffMercado Да, я пробовал это. Проблема заключается не в методе использования. Его как реализовать его рекурсивно (т. Е. Куда его поставить). До сих пор я пытался просто поставить pop() в конце, но это просто удаляет все элементы. – mrQWERTY

+0

Поскольку у меня возникли проблемы с пониманием проблемы, позвольте мне попытаться перефразировать то, что вы пытаетесь сделать. 'stack' - это список узлов в дереве, предназначенный для представления пути к целевому узлу. Вы обнаруживаете узел на полной глубине в первом проходе. Когда вы посещаете узел, вы добавляете его в список, но если вы вернетесь с этого узла, не найдя цель, вы удалите этот узел из списка, так как это не правильный путь вниз. Как только вы найдете цель, вернитесь полностью, не удаляя узлы, и у вас будет путь. Это звучит правильно? – James

ответ

3

Проблема в том, что информация о том, когда цель найдена, должна быть передана обратно вызываемым экземплярам getPath. Построение стека является своего рода «побочным эффектом» находки. Поэтому я предлагаю вам вернуть логическое значение в getPath, то есть True, если цель была найдена в рамках текущего поддерева. Затем мы знаем, что мы должны приложить значение к «стопке»:

def getPath(self, target): 

    stack = [] 

    def _getPath(head): 
     nonlocal stack 
     nonlocal target 
     if head.value == target: 
      stack.append(head) 
      return True 
     for child in (head.left, head.right): 
      if child is not None: 
       if _getPath(child): 
        stack.append(head) 
        return True 
     return False 


    _getPath(self.root) 
    return reversed(stack) 
+0

Извините, довольно много ошибок в первой версии, теперь это должно работать :) – Pachelbel

+0

Вы также можете использовать стек как возвращаемое значение и, например, return None, если ничего не найдено в поддереве. Таким образом, вы можете избежать нелокального стека. – Pachelbel

Смежные вопросы