result = self.items.find(KeyPair(key))要记住,find操作会在二叉搜索树中搜索相等(==)的目标元素 。这时,KeyPair(key)将会和BST中具有相同键的键值对相“匹配”,从而返回这个匹配的KeyPair对象 。因此,我们只需要填写键值对的键这部分数据,就能够检索这个键的实际记录了 。
为了使我们的TreeMap类能够像Python字典一样地工作,我们还需要实现Python里用来进行索引操作的常用钩子函数:__getitem__和__setitem__ 。
def __getitem__(self, key):result = self.items.find(KeyPair(key))if result is None:raise KeyError()else:return result.valuedef __setitem__(self, key, item):partial = KeyPair(key)actual = self.items.find(partial)if actual is None:# no pair yet for this key, add oneactual = partialself.items.insert(actual)actual.value = https://www.isolves.com/it/cxkf/sf/2020-06-01/item当给定的键没有出现在字典里的时候,这些方法都会需要一些额外的工作来处理这个特殊的情况 。在这种情况下,__getitem__方法会抛出KeyError异常 。但是,当__setitem__得到一个新的键的时候,它需要将一个新的KeyPair对象插入到BST对象里去 。然而,由于我们已经在一开始就创建了新的KeyPair对象partial来进行初始搜索,因此把它用来设置一个新条目将会是一件简单的事情 。
这些代码就足够让我们的TreeMap类启动并且运行了 。当然,这个类仍然缺少允许我们按顺序来访问所有元素的迭代器(如用来输出所有成员的列表) 。我们将会把添加这些功能作为练习题留给你来完成 。
7.7 小结我们在这一章里介绍了一些用来实现树结构的基本算法和相应的数据结构 。以下是关于这些重要亮点的总结 。
- 树是一个非线性的容器类,它可以被用来存储分层数据或者存储有组织的线性数据,从而能够有效地去访问它们 。
- 树结构通常使用链式结构来进行存储,但是它也可以被存储在数组里 。
- 许多使用树结构的应用程序都使用的是二叉树,它代表着每个节点都有零个、一个或两个子节点 。当然,也可以实现具有任意数量子节点的树 。
- 二分查找属性是指,对于每一个节点,它的左子树中的每一个节点的值都会小于或等于当前节点的值;它的右子树中的每一个节点的值将会大于当前节点的值 。
- 二叉搜索树的搜索、插入和删除操作都支持Θ (lgn)时间复杂度的实现,并且,这些操作还能同时保持每个节点的二分查找属性 。
- 树的相关算法通常都会使用递归来编写,这是因为树本身就是一个递归数据结构 。
- 3个常见的二叉树遍历顺序为:前序、中序和后序 。二叉搜索树的中序遍历将会按照排序的顺序来输出元素 。
推荐阅读
- 在生意参谋中通过以下哪个模块可以查看竞品的流量结构 在生意参谋中通过以下哪个模块可以查看竞品的流量结构
- centos7目录结构 理解各个目录的功能
- 茶树菇怎么保存呢,茶树菇怎么炒好吃
- MAC如何实现屏幕缩放
- 懂过古树的口感特点,懂过古茶山
- 成年老茶的别样滋味,新品上市2015老同志深山老树茶生茶上市
- 茶树菇炒羊肉的做法,茶树菇炒里脊肉的做法
- 茶香胡乱炖的做法,茶树菇炖柴鸡的做法
- 倒茶也能端庄大雅,2012年中茶牌布朗大树开汤品鉴
- 茶树菇有哪些功效禁忌,百合菊花茶的功效和禁忌有多少
