伸展树的python实现
来源:互联网 发布:java工程师看重学历吗 编辑:程序博客网 时间:2024/06/05 07:57
我的代码片:https://code.csdn.net/snippets_manage
# 定义顶点class Vertex: def __init__(self, key, sum, left, right, parent): (self.key, self.sum, self.left, self.right, self.parent) = (key, sum, left, right, parent)# 更新结点的sum属性def update(v): if v == None: return # v.sum = v.key + v.left.sum + v.right.sum v.sum = v.key + (v.left.sum if v.left != None else 0) + (v.right.sum if v.right != None else 0) if v.left != None: v.left.parent = v if v.right != None: v.right.parent = v# 左旋和右旋def smallRotation(v): parent = v.parent if parent == None: return grandparent = v.parent.parent # 右旋 if parent.left == v: m = v.right v.right = parent parent.left = m # 左旋 else: m = v.left v.left = parent parent.right = m update(parent) update(v) v.parent = grandparent if grandparent != None: if grandparent.left == parent: grandparent.left = v else: grandparent.right = v# zig-zig,zig-zagdef bigRotation(v): if v.parent.left == v and v.parent.parent.left == v.parent: # Zig-zig smallRotation(v.parent) smallRotation(v) elif v.parent.right == v and v.parent.parent.right == v.parent: # Zig-zig smallRotation(v.parent) smallRotation(v) else: # Zig-zag smallRotation(v); smallRotation(v);# 将结点v旋转至根节点 def splay(v): if v == None: return None while v.parent != None: if v.parent.parent == None: smallRotation(v) break bigRotation(v) return v# 搜索伸展树中键值为key的结点# 若结点存在,返回该结点# 若该结点不存在,返回大于该结点的最小结点# 若key对应的结点是树中的最大结点,返回Nonedef find(root, key): v = root last = root next = None while v is not None: if v.key >= key and (next is None or v.key < next.key): next = v last = v if v.key == key: break if v.key < key: v = v.right else: v = v.left root = splay(last) return (next, root)# 把伸展树分割成两棵子树left,right# left子树的结点的键值均小于key,right的结点的键值均大于等于keydef split(root, key): (result, root) = find(root, key) if result is None: return (root, None) right = splay(result) left = right.left right.left = None if left is not None: left.parent = None update(left) update(right) return (left, right)# 将两棵子树left和right合成一颗伸展树返回def merge(left, right): if left is None: return right if right is None: return left while right.left is not None: right = right.left right = splay(right) right.left = left update(right) return right# 往伸展树中插入一个结点def insert(x): global root (left, right) = split(root, x) new_vertex = None if right is None or right.key != x: new_vertex = Vertex(x, x, None, None, None) root = merge(merge(left, new_vertex), right) (N, root) = find(root, x)# 删除键值为x的结点def erase(x): global root # Implement erase yourself (left, right) = split(root, x) if right is None or right.key != x: root = merge(left, right) return right = right.right if right is None: root = merge(left, right) return right.parent = None root = merge(left, right) return
0 0
- 伸展树的python实现
- 伸展树的实现
- 伸展树的代码实现
- SplayTree伸展树的实现
- C++实现的完整伸展树程序
- 伸展树 之 Java的实现
- C++实现的完整伸展树程序
- 伸展树--Java实现
- 伸展树c++ 实现
- 伸展树实现
- 伸展树的旋转和伸展操作
- 伸展树的点点滴滴
- 伸展树的点点滴滴
- 伸展树的点点滴滴
- 伸展树的读书笔记
- 伸展树的实现qt,会的请截图留言
- 伸展树(splay tree)实现
- splay 伸展树 代码实现
- 动态添加布局
- java验证码的编写和校验
- html 的title中显示网页logo
- 我是一个尽量少用国产软件的软件开发工程师
- JAVA枚举的常见用法
- 伸展树的python实现
- servlet request请求对象常用方法总结
- C++中字符串取一个字符的一种方法
- Windows下配置Apache运行C语言的CGI脚本
- javascript void
- Qt字符串编码处理
- Swift基础(十八)UISegmentedControl
- 在onCreate()方法中获得view的宽高
- nyoj 1030 Yougth's Game[Ⅲ] 区间动规