二叉搜索树
来源:互联网 发布:淘宝海报多少钱一张 编辑:程序博客网 时间:2024/06/17 04:55
性质:对任何节点x,其左子树中的关键字最大不超过x.key,右子树中的关键字最小不低于x.key
基本操作所花费的时间与树的高度成正比;search/minimum/maximun/predecessor/successor
随机构建一棵二叉搜索树的期望高度为O(lg n)
查找【O(h)】
TREE-SEARCH(x, k)
if x == NIL or k == x.key
return x
if k < x.key
return TREE-SEARCH(x.left, k)
else
return TREE-SEARCH(x.right, k)
最小
TREE-MINIMUM(x)
while x.left != NIL
x = x.left
return x
最大
TREE-MAXIMUN(x)
while x.right != NIL
x = x.right
return x
后继和前驱
TREE-SUCCESSOR(x)
if x.right != NIL
return TREE-MINIMUM(x.right)
y = x.p
while y != NIL and x == y.right
x = y
y = y.p
return y
插入【插入节点z,往下找到z插入的位置】
TREE-INSERT(T, z)
y = NIL //x的双亲节点
x = T.root //
while x != NIL
y = x
if z.key < x.key
x = x.left
else x = x.right
z.p = y
if y == NIL //树是空的
T.root = z
elseif z.key < y.key
y.left = z
else
y.right = z
删除【删除节点z】
1) z没有孩子节点,直接删除
2) z只有一个孩子,将其孩子提升到树中z的位置,并修改z的父节点的孩子节点以及孩子节点的父节点
3) z有两个孩子,先找z的后继y【递增顺序中在z的后面,一定在z的右子树中】,并让y占据z的位置
引入一个子过程TRANSPLANT,用另一棵子树替换一棵子树并成为其双亲的孩子节点;
TRANSPLANT(T, u, v)
if(u.p == NIL) //原树仅有一个节点
T.root = v
elseif u == u.p.left
v = u.p.left
else v = u.p.right
if v != NIL
v.p = u.p
TREE-DELETE(T, z)
if(z.left == NIL)
TRANSPLANT(T, z, z.right)
elseif z.right == NIL
TRANSPLANT(T, z, z.left)
else y = TREE-MINIMUN(z.right) //找到z的右子树的最小节点,即z的后继节点;y肯定没有左孩子
if y.p != z //如果y不是z的子节点,则先让y的右孩子节点代替y,再让y代替z的位置
TRANSPLANT(T, y, y.right)
y.right = z.right
y.right.p = y
TRANSPLANT(T, z, y)
y.left = z.left
y.left.p = y
0 0
- 【二叉搜索数】HDU3791二叉搜索树
- 二叉树--二叉搜索树
- 【二叉树】二叉搜索树
- 二叉树- 二叉搜索树
- 【搜索树】二叉搜索树
- 二叉搜索树BSTree
- 二叉搜索树
- 二叉搜索树
- 二叉搜索树
- 最优二叉搜索树
- 二叉搜索树
- 二叉搜索树
- HDOJ3791 二叉搜索树
- 二叉查找树搜索
- 二叉搜索树
- 二叉搜索树
- BST 二叉搜索树
- 二叉搜索树
- 【矩阵快速幂】HDU 4549 : M斐波那契数列(矩阵嵌套)
- 计数排序
- hihocoder#1050之树中最长路
- JVM中内存的分类
- 7-1通信系统中为什么要进行编码和解码?常见的编码方法有哪些?
- 二叉搜索树
- hdoj Color the ball
- U3D中ShaderForge插件使用系列教程之一
- 增量型编码器驱动
- Intersection of Two Linked Lists--LeetCode
- Python 的 “ SyntaxError: invalid syntax ”
- 通信系统中为什么要进行调制和解调?调制的分类方法有哪些?
- Hadoop家族产品学习路线
- RFID第三次作业:7.1和7.2