如何在算法中调用二进制搜索树

时间:2013-12-11 22:40:29

标签: python dictionary

我正在尝试创建一个简单版本的拼写检查,它带有.txt文件,并比较是否在字典中找到每个单词。我已经建立了将.txt文件转换为列表并将字典转换为列表的函数,但是我在拼写检查函数中正在努力调用我的排序二进制搜索树中的字典。这是BinarySearchTree的类,后跟我的拼写检查函数

class BinarySearchTree:

    def __init__(self):
        self.root = None

    def insert(self,val):
        if self.root == None:
            self.root = BinaryNode(val)
        else:
            self.recursive_insert(root,val)

    def recursive_insert(self,parent,val):
        if parent.data < val:
            if parent.right != None:
                self.recursive_insert(parent.right,val)
            else:
                parent.right = BinaryNode(val)
        else:
            if parent.left != None:
                self.recursive_insert(parent.left,val)
            else:
                parent.left = BinaryNode(val)

    def dictionary_insert(self,text):
        for word in text:
            self.insert(word)

    def search(self,val):
        if self.recursive_search(self.root,val) != None:
            return True
        else:
            return False

    def recursive_search(self,parent,val):
        if parent.data == val:
            return parent
        elif parent.data > val:
            return self.recursive_search(parent.left,val)
        else:
            return self.recursive_search(parent.right,val)

这是我的拼写检查功能:

def spell_checker(text):

    N = len(text)
    misspelled = 0
    for i in range(N):
        if BinarySearchTree().search(text[i]) == True:
            misspelled = misspelled
        else:
            misspelled = misspelled + 1
            print text[i]
    if misspelled == 0:
        print "There are no spelling errors!"

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

当您第一次致电recursive_search时,您将self.root作为parent传递。但是,在__init__中,self.root设置为None。因此,尝试访问parent.data会给您一个错误,因为None.data不存在。作为设置过程的一部分,您需要执行dictionary_insert,传入有效单词列表,以便树中实际包含单词:

dct = BinarySearchTree()
dct.dictionary_insert(valid_word_list)

您还需要更正insert的最后一行:

self.recursive_insert(self.root, val)

答案 1 :(得分:0)

只是为了填写这个答案:

recursive_search调用无法正确处理失败:

def recursive_search(self,parent,val):
    if parent.data == val:
        return parent
    elif parent.data > val:
        return self.recursive_search(parent.left,val)
    else:
        return self.recursive_search(parent.right,val)

如果在树中根本找不到该单词,最终将调用此parent参数设置为None,语句if parent.data == val:将抛出{{ 1}}例外。

此处的解决方案是在NoneType

时返回None
parent == None