विधि बाइनरी पेड़ के लिए लक्षण है - पायथन, पायथन-3.x, बाइनरी-पेड़

मैंने बाइनरी ट्री का कार्यान्वयन किया हैअजगर और देखना चाहता था कि क्या यह आइसोमेक्ट फंक्शन के साथ काम करता है। जब मैंने कोड का परीक्षण किया और कुछ मान डाले जो मैंने "नोट किए हैं, तो वह अजगर किसी तरह पेड़ से मूल्यों को हटा रहा है, क्योंकि अगर मैं जांचता हूं कि क्या रूट समान है तो कोई भी मुझे सही नहीं मिलता है। मैं गलत क्या कर रहा हूं? इसके नीचे मेरा कोड है:

class BinTree():

def __init__(self, item = None):

self.item = item
self.left = None
self.right = None

class Tree():

def __init__(self):

self.root = None

def put(self, indata):

p = self.root
tree = BinTree(indata)

if p == None:
print("yey")
p = tree
return p
else:
while True:

if indata > p.item:
#if bigger, go right
if p.right == None:
#if right slot is empty, make one
p.right = p
return
#return to go back to the base level
elif p.right != None:
#if right slot is full, go deeper
p = p.right
#do not return to keep same level and repeat the loop
elif indata < p.item:
#if smaller, go left
if p.left == None:
#if left slot is empty, make one
p.left = p
return
#return to go back to the base level
elif p.left != None:
#if left slot is full, go deeper
p = p.left
#do not return to keep same level and repeat the loop
else:
#if equal
return False
#return False if the value already exist in the tree

def isempty(self):

if self.root == None:
return True
else:
print("yey2")
return False

और फिर शेल में मैं जो मान लिखता हूं:

>>> Tree().put(9)
yey
<__main__.BinTree object at 0x105a57eb8>
>>> Tree().isempty()
True

उत्तर:

जवाब के लिए 0 № 1

आपने कभी सेट नहीं किया self.root; सिर्फ तुम प्रतिक्षेप pp एक अलग वैरिएबल है, इसे सेट करना सेट नहीं होगा self.root

के बग़ैर self.root सेट, आपका पेड़ खाली रहता है।

ध्यान दें कि क्योंकि None एक सिंगलटन है, पायथन में जो आप सामान्य रूप से उपयोग करते हैं is वस्तु का परीक्षण करना। आपने अपनी कई अन्य गलतियाँ कीं put() विधि जिसे आप सही करना चाहते हैं, जैसे कि परिपत्र संदर्भ बनाना p.right = p नया डालने के बजाय tree नोड।

मैंने यह स्पष्ट करने के लिए कुछ भिन्न चर नाम चुने हैं कि क्या होता है; newnode के बजाय tree तथा current के बजाय p:

def put(self, indata):
newnode = BinTree(indata)

if self.root is None:
self.root = newnode
return self.root

current = self.root
while True:
if indata > current.item:
# if bigger, go right
if current.right is None:
# if right slot is empty, make one
current.right = newnode
return newnode
else:
current = current.right
elif indata < current.item:
# if smaller, go left
if current.left is None:
# if left slot is empty, make one
current.left = newnode
return newnode
else:
# if left slot is full, go deeper
current = current.left
else:
# if equal
return False

मैं शायद वापस आऊँगा None यदि नोड वृक्ष में पहले से मौजूद था, बजाय False; इस तरह से आप हालत के लिए बेहतर परीक्षण कर सकते हैं:

newnode = tree.put(datapoint)
if newnode is None:
# already present in the tree, do something with that info

तुंहारे isempty विधि अन्यथा सही है; हालांकि, इसे सरल बनाया जा सकता है == तथा is ऑपरेटर पहले से ही उत्पादन करते हैं True या False; उस परिणाम को वापस करें:

def isempty(self):
return self.root is None

इन परिवर्तनों के साथ, isempty() विधि मेरे लिए काम करती है:

>>> class BinTree():
...     def __init__(self, item = None):
...         self.item = item
...         self.left = None
...         self.right = None
...
>>> class Tree():
...     def __init__(self):
...         self.root = None
...     def put(self, indata):
...         newnode = BinTree(indata)
...         if self.root is None:
...             self.root = newnode
...             return self.root
...         current = self.root
...         while True:
...             if indata > current.item:
...                 # if bigger, go right
...                 if current.right is None:
...                     # if right slot is empty, make one
...                     current.right = newnode
...                     return newnode
...                 else:
...                     current = current.right
...             elif indata < current.item:
...                 # if smaller, go left
...                 if current.left is None:
...                     # if left slot is empty, make one
...                     current.left = newnode
...                     return newnode
...                 else:
...                     # if left slot is full, go deeper
...                     current = current.left
...             else:
...                 # if equal
...                 return False
...     def isempty(self):
...         return self.root is None
...
>>> tree = Tree()
>>> tree.isempty()
True
>>> tree.put(5)
<__main__.BinTree object at 0x10a520cf8>
>>> tree.isempty()
False

संबंधित सवाल
सबसे लोकप्रिय