Bir İkili Arama Ağacı gelen bir Listesi Oluşturma

oy
4

Bir ikili arama ağacında tüm öğelerin bir listesini yapmaya çalışıyorum. Ben Özyinelemeyi anlıyorum ama her değer döndürmek ve daha sonra bir liste halinde ekler nasıl bilmiyorum. Ben adlı bir işlev oluşturmak istiyorum makeList()benim ağaçtaki tüm öğelerin bir listesini döndürür. Benim programlarında Tüm fonksiyonlar dışında çalışmak makeList()fonksiyonu ve herkesin ağacımı kurmak nasıl temel yapısını anlamasını sağlamak için dahil edilmiştir.

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)

Benim baktığımızda makeList()çalışmıyor ama o iş yapmak nasıl bilmiyorum neden fonksiyonu anlayabiliyorum.

DÜZENLE

Tamam anladım! Ve hatta iki cevap var:

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

ve

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

Ve bunun kitaplarını vurmak zamanı yüzden çok iyi özyinelemeye anlamıyorum görebilirsiniz arkaya bakmak! Herkes özyineleme üzerinde iyi kaynaklar var mı?

Başka bir soru, bu yüzden benim derim makeList()işlevi. Python aracılığıyla gittiğinde makeList()o vardığında, self.makeList(aNode.lChild, a)o hala bitiriyor ise yine işlevini çalıştırmaya başlamak gelmez makeList()işlevi ya da her şey duracak ve sadece bu yenilikler ile yeniden başlar aNode?

Ben mantıklı umuyoruz.

Oluştur 05/04/2011 saat 02:09
kaynak kullanıcı
Diğer dillerde...                            


3 cevaplar

oy
1

inOrderşeyleri basar ama bir liste oluşturmak için yararsız yani, hiçbir şey döndürmez. Sen bir yolunu gerek dönmek için her düğümü. Bu sınıf yer almayan bir şey olabilir, ama kontrol edebilir yieldkomutu.

Cevap 05/04/2011 saat 02:21
kaynak kullanıcı

oy
0

Temel fikir böyle bir şeydir:

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

aslında Inorder aynı şeydir Bak nasıl?

Sen biraz daha zor uygulamak için yapar programda farklı bir yapıya sahip, ancak temel fikir aynıdır.

Cevap 05/04/2011 saat 02:43
kaynak kullanıcı

oy
1

Çok yaklaştın! makeList oldukça basit olabilir:

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

Temel olarak, geçmiş boş düğümleri Recurse çalışmadığınızdan emin olun. Sonra sol ağacın, cari düğüm ve sağ ağacın listesinin listesini döndürür.

Cevap 05/04/2011 saat 03:15
kaynak kullanıcı

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