python实现二叉查找树
class BSTMapNode(object): def __init__(self, key, value): self.key = key self.value = value self.left = None self.right = None # 以列表作为底层存储 class BSTMapIterator(object): def __init__(self, root): self.the_keys = list() self.cur_item = 0 # 初始化内置list,并将索引reset self.bst_travel(root) self.cur_item = 0 def __iter__(self): return self # 遍历列表即可 def __next__(self): if self.cur_item < len(self.the_keys): key = self.the_keys[self.cur_item] self.cur_item += 1 return key else: raise StopIteration # 这个递归!中序遍历 def bst_travel(self, sub_tree): if sub_tree is None: return self.bst_travel(sub_tree.left) self.the_keys[self.cur_item] = sub_tree.key self.cur_item += 1 self.bst_travel(sub_tree.right) class BSTMap(object): def __init__(self): self._root = None self._size = None def __len__(self): return self._size def __iter__(self): return BSTMapIterator(self._root) def __contains__(self, key): return self.bst_search(self._root, key) is not None def value_of(self, key): node = self.bst_search(self._root, key) return node.value # 递归搜索 def bst_search(self, sub_tree, target): if sub_tree is None: return None elif target < sub_tree.key: return self.bst_search(sub_tree.left, target) elif target > sub_tree.key: return self.bst_search(sub_tree.right, target) else: return sub_tree # 查找最小节点 def bst_min(self, sub_tree): if sub_tree is None: return None elif sub_tree.left is None: return sub_tree else: return self.bst_min(sub_tree.left) # 若key=sub_tree的key ,替换value def add(self, sub_tree, key, value): node = self.bst_search(sub_tree, key) if node is not None: node.value = value return False else: self._root = self._bst_insert(self._root, key, value) self._size += 1 return True # 如果树为空,则将新建节点并返回,若key小于根节点,则递归插入左子树,key大于根节点,递归插入右子树 def _bst_insert(self, sub_tree, key, value): if sub_tree is None: sub_tree = BSTMapNode(key, value) elif key < sub_tree.key: sub_tree.left = self._bst_insert(sub_tree.left, key, value) elif key > sub_tree.key: sub_tree.right = self._bst_insert(sub_tree.right, key, value) return sub_tree def remove(self, key): self._root = self._bst_remove(self._root, key) self._size -= 1 def _bst_remove(self, sub_tree, target): if sub_tree is None: return sub_tree # 目标比当前节点小,则递归删除左子树的对应节点,否则递归删除右子树对应节点 elif target < sub_tree.key: sub_tree.left = self._bst_remove(sub_tree.left, target) return sub_tree elif target > sub_tree.key: sub_tree.right = self._bst_remove(sub_tree.right, target) return sub_tree # 目标等于当前节点 else: # 目标是叶子节点 if sub_tree.left is None and sub_tree.right is None: sub_tree = None # 目标只有左子树或右子树 elif sub_tree.left is None or sub_tree.right is None: if sub_tree.left is not None: sub_tree = sub_tree.left else: sub_tree = sub_tree.right # 目标同时有左右子树 # 查找右子树的最小节点,置为当前节点,并将其删除 else: successor = self.bst_min(sub_tree.right) sub_tree.key = successor.key sub_tree.value = successor.value sub_tree.right = self._bst_remove(sub_tree.right, successor.key) return sub_tree
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗