Python 中使用二叉树进行值比较

50 阅读2分钟

在 Python 中,有同学使用二叉树来进行值比较,但是遇到了一个问题:程序运行后没有输出任何内容。经过检查,发现问题出在了二叉树的 exists() 方法和最后的 if 语句上。

huake_00066_.jpg

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=" ")