Vytvoření seznamu z binárního vyhledávacího stromu

hlasů
4

Snažím se vytvořit seznam všech položek v binárním vyhledávacím stromu. Chápu, že rekurzi, ale nevím, jak ji vrátit všechny hodnoty a pak připojit jej do seznamu. Chci vytvořit funkci s názvem makeList(), který vrátí seznam všech položek v mém stromě. Všechny funkce ve svých programech pracovat s výjimkou makeList()funkce a jsou zahrnuty, aby se ujistil, každý chápe základní strukturu, jak mám nastavit svůj strom.

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)

Při pohledu na mou makeList()funkci Chápu, proč to nefunguje, ale já nevím, jak, aby to fungovalo.

UPRAVIT

Dobře chápu to! A dokonce jsem dostal dvě odpovědi, které jsou:

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

a

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

A při pohledu zpět vidím, že nerozumím rekurzi velmi dobře, a tak je čas udeřit do knihy! Každý, kdo má nějaké dobré zdroje na rekurze?

Další otázkou, takže říci, volám makeList()funkci. Když Python prochází makeList(), když se dostane na self.makeList(aNode.lChild, a)to znovu rozběhnou funkce, zatímco je stále dokončuje makeList()funkci, nebo se všechno zastaví a to jen začíná znovu s jeho novou aNode?

Doufám, že to dává smysl.

Položena 05/04/2011 v 02:09
zdroj uživatelem
V jiných jazycích...                            


3 odpovědí

hlasů
1

inOrdertiskne věci, ale nevrací nic, tak je to k ničemu pro sestavování seznamu. Budete potřebovat způsob, jak vrátit každý uzel v pořádku. Může to být něco, co vaše třída se dosud nevztahuje, ale podívejte se na yieldpovel.

Odpovězeno 05/04/2011 v 02:21
zdroj uživatelem

hlasů
0

Základní myšlenka je něco jako toto:

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

Podívejte se, jak je to v podstatě totéž, jako nezbytného?

Máte jinou strukturu ve svém programu, který dělá to trochu těžší realizovat, ale základní myšlenka je stejná.

Odpovězeno 05/04/2011 v 02:43
zdroj uživatelem

hlasů
1

Jsi tak blízko! makeList může být docela jednoduché:

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

Zjednodušeně řečeno, ujistěte se, že Nesnažíme se recurse past prázdné uzly. Pak se vraťte do seznamu v levé části stromu, aktuální uzel a seznam pravého stromu.

Odpovězeno 05/04/2011 v 03:15
zdroj uživatelem

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