Создание списка из бинарного дерева поиска

голоса
4

Я пытаюсь составить список всех элементов в бинарном дереве поиска. Я понимаю рекурсию , но я не знаю , как сделать это вернуть все значения , а затем добавить его в список. Я хочу создать функцию с именем , makeList()которая будет возвращать список всех элементов в моем дереве. Все функции в моих программах работают , кроме makeList()функции и включены , чтобы убедиться , что все понимают основную структуру того , как я создал мое дерево.

class Node(object):
    def __init__(self, data):
        self.data = data
        self.lChild = None
        self.rChild = None

class Tree(object):
    def __init__(self):
        self.root = None

    def __str__(self):
        current = self.root

    def isEmpty(self):
        if self.root == None:
            return True
        else:
            return False

    def insert (self, item):
        newNode = Node (item)
        current = self.root
        parent = self.root

        if self.root == None:
            self.root = newNode
        else:
            while current != None:
                parent = current
                if item < current.data:
                    current = current.lChild
                else:
                    current = current.rChild

            if item < parent.data:
                parent.lChild = newNode
            else:
                parent.rChild = newNode

    def inOrder(self, aNode):
        if aNode == None:
            pass
        if aNode != None:
            self.inOrder(aNode.lChild)
            print aNode.data
            self.inOrder(aNode.rChild)

    def makeList(self, aNode):
        a = []
        self.inOrder(aNode)
        a += [aNode.data]
        print a

n = Tree()
for i in [4,7,2,9,1]:
    n.insert(i)

n.makeList(n.root)

Глядя на моей makeList()функции я могу понять , почему он не работает , но я не знаю , как заставить его работать.

РЕДАКТИРОВАТЬ

Ладно, я понял! И я даже получил два ответа, которые являются:

def makeList(self, aNode, a = []):
    if aNode != None:
        self.makeList(aNode.lChild, a)
        a += [aNode.data]
        self.makeList(aNode.rChild, a)
    return a

а также

def makeList2(self, aNode):
    if aNode is None:
        return []
    return self.makeList2(aNode.lChild) + [aNode.data] + self.makeList2(aNode.rChild)

И оглядываясь назад, я вижу, что я не понимаю рекурсии очень хорошо, так что пришло время, чтобы поразить книги! Кто-нибудь есть какие-либо хорошие ресурсы на рекурсии?

Другой вопрос, так сказать , я называю makeList()функцию. Когда Python проходит makeList(), когда он попадет в self.makeList(aNode.lChild, a)это начать показ функции еще раз , пока он все еще заканчивает makeList()функцию или делает все остановки , и это только начинается снова с его новым aNode?

Я надеюсь, что в этом есть смысл.

Задан 05/04/2011 в 02:09
источник пользователем
На других языках...                            


3 ответов

голоса
1

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

Ответил 05/04/2011 в 02:21
источник пользователем

голоса
0

Основная идея что-то вроде этого:

def makeList(self):
    return self.lChild.makeList() + [self.data] + self.rChild.makeList()

Посмотрите, как это по существу то же самое, как заказовМои?

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

Ответил 05/04/2011 в 02:43
источник пользователем

голоса
1

Ты так близко! makeList может быть довольно просто:

def makeList(self, aNode):
    if aNode is None:
        # Stop recursing here
        return []
    return self.makeList(aNode.lChild) + [aNode.data] + self.makeList(aNode.rChild)

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

Ответил 05/04/2011 в 03:15
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more