在 Python 中,有同学使用二叉树来进行值比较,但是遇到了一个问题:程序运行后没有输出任何内容。经过检查,发现问题出在了二叉树的 exists() 方法和最后的 if 语句上。
2、解决方案
2.1 exists() 方法的修改
在原来的 exists() 方法中,它总是返回一个 True 值,导致 put() 方法永远不会被调用,因为 if root1.exists(word1) 总为真。
def exists(self, data1):
if data1 < self.data1:
if self.left1 is None:
return None, None
return self.left1.exists(data1)
elif data1 > self.data1:
if self.right1 is None:
return None, None
return self.right1.exists(data1)
else:
return self.data1
为了修复这个问题,需要修改 exists() 方法,让它在值不存在时返回 None,而不是一个元组 (None, None)。
def exists(self, data1):
if data1 < self.data1:
if self.left1 is None:
return None
return self.left1.exists(data1)
elif data1 > self.data1:
if self.right1 is None:
return None
return self.right1.exists(data1)
else:
return self.data1
2.2 if 语句的修改
在最后的 if 语句中,判断条件 if root1.exists(word1) 总是为 True,导致 print(word1, end=" ") 语句永远不会执行。这是因为 exists() 方法总是返回 True。
为了修复这个问题,需要将判断条件修改为 if root.exists(word1),即判断值是否在第一个二叉树中存在。
if root.exists(word1):
print(word1, end=" ")
2.3 代码示例
class BintreeEN:
def __init__(self, data1):
self.left1 = None
self.right1 = None
self.data1 = data1
def put(self, data1):
if data1 < self.data1:
if self.left1 is None:
self.left1 = BintreeEN(data1)
else:
self.left1.put(data1)
else:
if self.right1 is None:
self.right1 = BintreeEN(data1)
else:
self.right1.put(data1)
def exists(self, data1):
if data1 < self.data1:
if self.left1 is None:
return None
return self.left1.exists(data1)
elif data1 > self.data1:
if self.right1 is None:
return None
return self.right1.exists(data1)
else:
return self.data1
def write(self):
if self.left1:
self.left1.write()
print(self.data1)
if self.right1:
self.right1.write()
root = Bintree("root")
with open("word3.txt", "r", encoding="utf-8") as file:
for row in file:
word = row.strip()
checklist = root.exists(word)
if checklist == word:
pass
else:
root.put(word)
root1 = BintreeEN("root1")
with open('engelska.txt', 'r', encoding="utf-8") as f:
for row in f:
onerow = row.split()
for rowz in onerow:
word1 = rowz.strip()
if root1.exists(word1):
pass
else:
root1.put(word1)
if root.exists(word1): # Check if value is in the first tree
print(word1, end=" ")