[算法导论]二叉查找树的实现 @ Python
《算法导论》第三版的BST(二叉查找树)的实现:
class Tree:
def __init__(self):
self.root = None # Definition for a binary tree node
class TreeNode:
def __init__(self, x):
self.val = x
self.left = None
self.right = None
self.parent = None class Solution:
# @param root, a tree node
# @return an integer
def TreeSearch(self, x, k):
if x == None or x.val == k:
return x
if k < x.val:
return self.TreeSearch(x.left, k)
else:
return self.TreeSearch(x.right, k) def IterativeTreeSearch(self, x, k):
while x != None and x.val != k:
if k < x.val:
x = x.left
else:
x = x.right
return x def TreeMinimum(self, x):
while x.left != None:
x = x.left
return x def TreeMaximum(self, x):
while x.right != None:
x = x.right
return x def TreeSuccessor(self, x):
if x.right != None:
return self.TreeMinimum(x)
y = x.parent
while y != None and x == y.right:
x = y
y = y.parent
return y def TreeInsert(self, T, z):
y = None
x = T.root
while x != None:
y = x
if z.val < x.val:
x = x.left
else:
x = x.right
z.parent = y
if y == None:
T.root = z
elif z.val < y.val:
y.left = z
else:
y.right = z def InorderTreeWalk(self, x):
if x != None:
self.InorderTreeWalk(x.left)
print x.val
self.InorderTreeWalk(x.right) def Transplant(self, T, u, v):
if u.parent == None:
T.root = v
elif u == u.parent.left:
u.parent.left = v
else:
u.parent.right = v
if v != None:
v.parent = u.parent def TreeDelete(self, T, z):
if z.left == None:
self.Transplant(T, z, z.right)
elif z.right == None:
self.Transplant(T, z, z.left)
else:
y = self.TreeMinimum(z.right)
if y.parent != z:
self.Transplant(T,y,y.right)
y.right = z.right
y.right.parent = y
self.Transplant(T, z, y)
y.left = z.left
y.left.p = y # root = TreeNode(15)
T = Tree()
nodes = [6,18,3,7,17,20,2,4,13,9]
s = Solution()
for node in nodes:
s.TreeInsert(T,TreeNode(node))
s.InorderTreeWalk(T.root)
s.TreeDelete(T, T.root)
s.InorderTreeWalk(T.root)
[算法导论]二叉查找树的实现 @ Python的更多相关文章
- [算法导论]哈希表 @ Python
直接寻址方式: class HashTable: def __init__(self, length): self.T = [None for i in range(length)] class Da ...
- 算法导论 第一章and第二章(python)
算法导论 第一章 算法 输入--(算法)-->输出 解决的问题 识别DNA(排序,最长公共子序列,) # 确定一部分用法 互联网快速访问索引 电子商务(数值算 ...
- "《算法导论》之‘树’":二叉查找树
树的介绍部分摘取自博文二叉查找树(一).二叉查找树(二).二叉查找树. 1. 树的介绍 1.1 树的定义 树是一种数据结构,它是由n(n>=1)个有限节点组成一个具有层次关系的集合. 把它叫做“ ...
- [算法导论]quicksort algorithm @ Python
算法导论上面快速排序的实现. 代码: def partition(array, left, right): i = left-1 for j in range(left, right): if arr ...
- 算法导论第十八章 B树
一.高级数据结构 本章以后到第21章(并查集)隶属于高级数据结构的内容.前面还留了两章:贪心算法和摊还分析,打算后面再来补充.之前的章节讨论的支持动态数据集上的操作,如查找.插入.删除等都是基于简单的 ...
- [Algorithm] 如何正确撸<算法导论>CLRS
其实算法本身不难,第一遍可以只看伪代码和算法思路.如果想进一步理解的话,第三章那些标记法是非常重要的,就算要花费大量时间才能理解,也不要马马虎虎略过.因为以后的每一章,讲完算法就是这样的分析,精通的话 ...
- B树——算法导论(25)
B树 1. 简介 在之前我们学习了红黑树,今天再学习一种树--B树.它与红黑树有许多类似的地方,比如都是平衡搜索树,但它们在功能和结构上却有较大的差别. 从功能上看,B树是为磁盘或其他存储设备设计的, ...
- 红黑树——算法导论(15)
1. 什么是红黑树 (1) 简介 上一篇我们介绍了基本动态集合操作时间复杂度均为O(h)的二叉搜索树.但遗憾的是,只有当二叉搜索树高度较低时,这些集合操作才会较快:即当树的高度较高(甚至一种极 ...
- 基本数据结构(2)——算法导论(12)
1. 引言 这一篇博文主要介绍链表(linked list),指针和对象的实现,以及有根树的表示. 2. 链表(linked list) (1) 链表介绍 我们在上一篇中提过,栈与队 ...
随机推荐
- 专题:Channel Bonding/bonding
EtherChannel最初是由cisco提出,通过聚合多条物理链路为单条逻辑链路,从而实现高可用及提高吞吐量等目的.AgP(Port Aggregation Protocol,Cisco专有协议). ...
- u盘安装ubuntu
安装ubuntu 准备工作:首先需要安装好UltraISO(版本要比较新,有些老版本有照做后不能安装的错误) 准备好一个U盘. 下载好ubuntu光盘.(我用的12.04版) 步骤: 1.制作安装U盘 ...
- Google Chrome: Make the Bookmarks Bar Display as Icons Only
By reducing your bookmarks to show only the icons, you can access more of them from the Bookmarks ba ...
- Spring <context:annotation-config/> 解说
在基于主机方式配置Spring的配置文件中,你可能会见到<context:annotation-config/>这样一条配置,他的作用是式地向 Spring 容器注册 AutowiredA ...
- Delphi 的字符及字符串[5] - 字符串与 Windows API
先说赋值: //赋值方法1: 给直接量 begin SetWindowText(Handle, '新标题'); end; //赋值方法2: 定义它要的类型 var p: PChar; begi ...
- 升级adt插件后,eclipse突然出现Unable to build: the file dx.jar was not loaded from the SDK folder 错误
旧版的SDK管理器里面最高只能安装Android 3.2 API,需要更新SDK管理器版本后才能安装Android 4.0.Android 4.1,方法如下: http://blog.csdn.net ...
- C#设计模式——单件模式
一.为何需要单件模式 需求 我们开发了一个大型的项目,其中存在许多的工具类.但是其中很多的工具类我们并不是经常使用得到,甚至 一次都不会使用.但是这些工具类都是静态的类,会消耗很多的内存,即使一次都不 ...
- C#函数式编程之缓存技术
缓存技术 该节我们将分成两部分来讲解,第一部分为预计算,第二部分则为缓存.缓存这个技术对应从事开发的人员来说是非常熟悉的,从页面缓存到数据库缓存无处不在,而其最重要的特点就是在第一次查询后将数据缓存, ...
- jboss7(01)服务器开启和关闭命令
1.简单开启服务器的命令:进入到 bin 目录下,输入 ./standalone.sh 命令. 这种开启服务器的方式有个缺点,当你的命令窗口关闭后,服务自动down了 2.让服务器开启后在后台运行:进 ...
- 作业一:创建个人技术博客、自我介绍、简单的C程序
年9月14日中午12点: 一.主要内容 建个人技术博客(博客园 www.cnblogs.com) 本学期将通过写博客的方式提交作业,实际上,最终的目的是希望同学们能通过博客的形式记录我们整个学习过程 ...