Létrehozása egy listát a bináris keresés Fa

szavazat
4

Próbálom, hogy egy listát az összes elem bináris kereső fába. Megértem, hogy a rekurzió de nem tudom, hogyan kell tenni visszatér minden értéket, majd fűzze be a listába. Azt akarom, hogy hozzon létre egy függvényt hívott makeList(), hogy vissza fog térni egy listát az összes elem fám. Az összes funkciót a programokat dolgoznak, kivéve a makeList()funkciót, és tartalmazza, hogy mindenki érti az alapvető szerkezetét, hogyan állíthatom be a fát.

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)

Néztem makeList()funkció látom, hogy miért nem működik, de nem tudom, hogyan működik.

EDIT

Rendben, értem! És én is kaptam két válaszok, amelyek:

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

és

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

És visszatekintve látom, hogy nem értem a rekurzió nagyon jól, itt az ideje, hogy elérje a könyveket! Bárki bármilyen jó források rekurzió?

Egy másik kérdés, ezért azt mondják, hívom a makeList()funkciót. Amikor Python megy keresztül makeList(), amikor megkapja az self.makeList(aNode.lChild, a)nem is elkezdi a funkció ismét közben is befejező fel a makeList()funkciót, vagy nem minden megáll, és ez csak elölről kezdődik vele új aNode?

Remélem, hogy van értelme.

A kérdést 05/04/2011 02:09
a forrás felhasználó
Más nyelveken...                            


3 válasz

szavazat
1

inOrderkiírja a dolgokat, de nem tér vissza semmit, így ez felesleges az épület egy listát. Szüksége van egy módja annak, hogy visszatérjen minden csomópont érdekében. Ez lehet valami, hogy az osztály nem fedezte még, de nézd meg a yieldparancsot.

Válaszolt 05/04/2011 02:21
a forrás felhasználó

szavazat
0

Az alapötlet az, valahogy így:

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

Nézze meg, hogyan ez lényegében ugyanaz, mint a Inorder?

Van egy másik szerkezet a program, ami egy kicsit nehezebb megvalósítani, de az alapötlet ugyanaz.

Válaszolt 05/04/2011 02:43
a forrás felhasználó

szavazat
1

Nagyon közel! makeList is elég egyszerű:

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

Alapvetően, győződjön meg róla, hogy nem próbál recurse már üres csomópontokat. Ezután visszatér a listát a bal oldali fában, az aktuális csomópont, és a listát a jobb oldali fa.

Válaszolt 05/04/2011 03:15
a forrás felhasználó

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