【问题标题】:Python Binary Search Tree with key and value具有键和值的 Python 二叉搜索树
【发布时间】:2017-05-29 00:05:37
【问题描述】:

我需要实现一个二叉搜索树类作为作业,但我很难实现插入功能。我已经通过谷歌看了很多,以找到一些解决方案或可能性,但他们都没有使用键和值(主要是值),或者如果他们也使用了键,他们有很多单独的功能,我是我认为不允许这样做。

所以预建就是:

class Node:
    def __init__(self, key, value):
        self.key = key
        self.value = value
        self.left = self.right = None

class BinarySearchTree:
    def __init__(self):
        self.root = None
        self.size = 0

    def __len__(self):
        return self.size

    def insert(self, key, value):
        pass

    def remove(self, key):
        pass

    def find(self, key):
        pass

现在的问题是,如果我想检查例如该值是小于还是大于当前节点以将其放在右侧或左侧,我会收到诸如“root is not defined”或“root.right”之类的错误" 没有这样的属性等... 我想这是有道理的,因为 self.root 被声明为 None。

但是我现在如何真正修复它以使插入功能正常工作?

我对这个任务有点困惑,因为它使用键+值,所以我需要插入绑定到特定键的值,如果键已经存在,覆盖它的值。

【问题讨论】:

  • self.root 是干什么用的?
  • 说实话,我自己都不认识……根可能是树的第一个。
  • 哦,我想我明白了。根只是一个节点。让您的插入函数检查 root 是否为 None,如果是,则为其分配一个新节点

标签: python insert key binary-search-tree


【解决方案1】:

它是早上 5 点,所以这可能是错误的,但这里是:
key 是我们排序的依据,值不感兴趣
你的插入函数应该看起来像这样:

def insert(self, key, value):
        if self.root = None:
            self.root = Node(key,value)
            return
        #regular binary tree traversal (comparing the key) to find where to insert, lets assume we need to insert on the left
        parent.left = Node(key,value)

你能从这里弄清楚还是你想要更多的方向

【讨论】:

  • 我也有一个开始的想法来检查 root 是否为 None,然后为其分配新的 Node(key, value)。在那之后,我想我需要检查这个值是大于还是小于某个东西,所以它要么向左要么向右。但我不知道如何/检查什么,因为键值部分让我感到困惑。
  • 添加作业的措辞怎么样?也许我们可以帮助了解您需要什么
  • 虽然不是英文的..我尽力翻译它:“这个语义应该做以下事情: tree.insert(key, value) :将给定的值放在特定的键下。如果key已经存在,则将其值替换为新的值,否则以二叉搜索树条件仍然正确的方式创建一个新的Node tree.remove(key):删除特定key下的节点,而BST条件仍然正确。如果key不存在,则提交KeyError Exception。found=tree.find(key):返回特定key的节点,如果不存在,则返回None。
  • 在它说“这是 Node 的定义和 SearchTree 的基本定义”之前(在此处插入上面的代码)。实现 SearchTree 的完整工作实现。而要编辑的部分是目前在代码中“通过”的部分。
  • 哦,我认为它是一个带有“键”的常规二叉树,值在计算上并不有趣
【解决方案2】:

您没有指定,但我猜测键的目的是确定特定键是否已经在树中,如果是,则替换 O(1) 运行时复杂度中的相关节点的值。

因此,当您插入节点时,您将首先检查字典中的键(您将在__init__ 中自己初始化一个空字典)。如果它已经存在,那么您只需要替换该特定键的节点值即可。否则,您添加新节点的方式与在任何 BST 中相同,并且还记得更新您的字典以将键映射到它的节点。

【讨论】:

  • 我认为插入的“键”可能是“左”或“右”
  • 就是这样,这是预先构建的,我显然已经拥有了我需要的一切,我只允许更改目前只是内部传递的功能。
猜你喜欢
  • 2017-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-08
  • 2017-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多