एक द्विआधारी खोज पेड़ से एक सूची को तैयार करना

वोट
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()समारोह। जब अजगर के माध्यम से चला जाता है 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()

देखें कैसे यह अनिवार्य रूप से inorder के रूप में एक ही बात है?

आप इसे थोड़ा मुश्किल लागू करने के लिए करता है कि अपने कार्यक्रम में एक अलग संरचना है, लेकिन मूल विचार ही है।

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)

असल में, सुनिश्चित करें कि आप अतीत खाली नोड्स recurse की कोशिश नहीं कर रहे हैं। फिर बाईं ओर पेड़, वर्तमान नोड, और सही पेड़ की सूची की सूची वापस जाएँ।

05/04/2011 को 03:15
का स्रोत उपयोगकर्ता

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