【问题标题】:Python Recursive Binary Search TreePython 递归二叉搜索树
【发布时间】:2021-07-03 21:49:25
【问题描述】:

我正在尝试使用 Node 类和 Tree 类在 python 中递归实现二叉搜索树。

# MAKE CUSTOM ERROS
class Error(Exception):
    pass

class InvalidKeyError(Error):
    pass

# TREE NODE CLASS
class TreeNode():
    def __init__(self, inKey, inValue): # eahc node has a key with an associated value
        self._key = inKey
        self._value = inValue
        self._left = None
        self._right = None

    def __str__(self): # Used for printing
        return ("Key: " + str(self._key) + " Value: " + str(self._value))

# SEARCH TREE CLASS
class BinarySearchTree():
    def __init__(self):
        self._root = None # start with an empty tree

    # Wrapper method
    def find(self, key):
        return self._findRec(key, self._root)

    def _findRec(self, key, cur):
        value = None
        if cur == None:
            raise InvalidKeyError("Key " + str(key) + " not found")
        elif key == cur._key: # Base case: found
            value = cur._value
        elif key < cur._key: # goes left
            value = self._findRec(key, cur._left)
        else: # goes right
            value = self._findRec(key, cur._right)
        return value

    # Wrapper method
    def insert(self, key, data):
        return self._insertRec(key, data, self._root)

    def _insertRec(self, key, data, cur):
        updateNode = cur
        if cur == None:
            updateNode = TreeNode(key, data)
        elif key == cur._key: # in the tree
            raise InvalidKeyError("Key " + str(key) + " is already in the tree")
        elif key < cur._key:
            cur._left = self._insertRec(key, data, cur._left)
        else:
            cur._right = self._insertRec(key, data, cur._right)
        return updateNode
    
# TESTING
if __name__ == "__main__":
    myTree = BinarySearchTree()
    myTree.insert(9, "nine")
    myTree.insert(5, "five")
    myTree.insert(13, "thirteen")

    print(myTree.find(13))

在我的树中插入键/值时我没有收到任何错误,但我在尝试在树中查找节点时收到错误。
InvalidKeyError: Key 13 not found p>

我的插入方法是否存在逻辑错误?谢谢!

【问题讨论】:

  • 从第 31 行抛出错误 raise InvalidKeyError("Key " + str(key) + " not found") 如果您查看前一行,您将看看为什么。
  • 树没有正确构建,或者您没有正确搜索它。我会首先编写一个函数来输出整个树,这样你就可以确定它是否正确构建。
  • 这里的问题是你从来没有设置self._root。它总是无,所以find 首先失败了。一些调试打印就会向您展示这一点。
  • 我们还希望您在错误点之前跟踪可疑值。您对他们如何达到这些价值观感到困惑?

标签: python class recursion data-structures binary-search-tree


【解决方案1】:

递归插入的东西不能工作。当您注意到您的节点为空时,您不再需要修改任何内容。这似乎有效:

    def _insertRec(self, key, data, cur):
        newnode = TreeNode(key, data)
        if not self._root:
            self._root = newnode
            return

        while key != cur._key:
            if key < cur._key:
                if not cur._left:
                    cur._left = newnode
                    return
                cur = cur._left
            else:
                if not cur._right:
                    cur._right = newnode
                    return
                cur = cur._right
                
        raise InvalidKeyError("Key " + str(key) + " is already in the tree")

【讨论】:

    猜你喜欢
    • 2019-04-17
    • 2014-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-14
    • 1970-01-01
    相关资源
    最近更新 更多