AVL平衡树
来源:互联网 发布:数据库完整性约束范例 编辑:程序博客网 时间:2024/06/05 23:51
1。红黑数:5个性质,红黑组成,红字节点为黑,根为黑,叶为黑,跟到任意叶路径上黑和相等。红黑树不是严格的平衡树(左右深度可能相差大于1)
红黑树作插入和删除也需要树的调整。
2。hash可以使用先用一个hash公式计算hash数组,每个数组数据用指针用来保存可能计算后到达本节点值。因为HASH可能计算重复,使用指针确保所有情况都考虑到。
3.B-tree,B+-tree:多分路树,http://blog.csdn.net/v_JULY_v/article/details/6530142/
3.Suffix tree—后缀树。
AVL性质:
1、树的任意一节点左右深度差不超过1。
2、一个节点: 左边深度-右边深度=0平重
左边深度-右边深度=1左重
左边深度-右边深度=-1右重(左右深度不超过1)
3、新节点自身平衡。
添加:(网上那些方法都一样的)
1、任意一节点:
其中c平重而b(左/右)重,c左重。失去平衡,向上判断平衡。
c
b
其中c右重而b(左/右)重,c平重。不用向上平衡。
c
b
其中c,b都左重(说明a多了一层):b右->c,c左->b右。此时b,c都平衡了(b右边多了一层平衡,c左边少一层平衡)以前树到C平衡,限制B深度=以前的C,也平衡了。不用向上平衡了。
.... ...
c b
b -----> a c
a d ... d ...
其中c左重,b右重:b右->d左,d左->b,c左->d右,d右->c。如果d左重或者平重,b平重了(因为b右重了,现在右边-1层);如果d右重了,b接d的左边,b将左重。如果d右重或者平重,c平重了(因为c左重并且b右重了,对于C来说左边多了2层就在D这里,现在左边-2层);如果d左重了,c接d的右边,b将右重。而对于d而言平衡了(c-1层,b不变,c和b深度一样)并且深度和以前一样,不影响上一级的平衡,不用向上平衡了。
.... ...
c d
b -----> b c
a d a... ...
右边也是同上。
删除:
1、找到该节点。
2、始终以该节点左边最大值/右边最小值来代替。
3、我们以左边最大值为例:(如果删除节点左边为空值,说明该节点只有一个或者没有右值,直接用右值代替,并且返回减少一层)
(1)提取左边最大值节点,用该节点左节点代替它。并且此时该节点减少一层。向上做平衡处理。
(2)回来任意一节点从右边回来,并且右边少一层(不少层平衡),(1.1)如果该节点本身等重,那么就左重,并且树平衡;
(1.2)如果右重该节点平衡,少一层向上报告。
(1.3)如果左重,看其左节点:(2.1)如果平衡,那么c左=b右,b右=c,b右重,c左重。与以前保持平衡。
.... ...
c b
b -----> a c
a d ... d ...
(2.2)如果左重,那么c左=b右,b右=c,b等重,c等重。层数-1向上报告。
.... ...
c b
b -----> a c
a ... ...
(2.2)如果右重,那么c左=d右,d右=c,b右=d左,d左=b;如果d平衡,那么c,b等重。如果d左重,那么b等重,c右重。如果d右重,那么b左重,c等重。层数-1向上报告。
.... ...
c d
b -----> b c
d ... ...
从左边回来,反之。
可以使用左右深度来测试树是否平衡。我用这种方法用50000个数据来测试可以保持平衡。添加+删除+打印时间几秒。
- AVL(平衡树)
- AVL平衡树实现
- AVL 平衡二叉树
- 平衡二叉树(AVL)
- AVL平衡树实现
- 平衡二叉树(AVL)
- AVL平衡树
- AVL 平衡二叉树
- avl平衡二叉树
- 二叉平衡树AVL
- 平衡二叉树(AVL)
- 平衡二叉树(AVL)
- 平衡二叉树 AVL
- 平衡二叉树(AVL)
- 平衡二叉树(AVL)
- 平衡二叉树(AVL)
- 平衡二叉树(AVL)
- AVL平衡树
- Pushlet 2.0.3 源码分析
- leetcode || 62、Unique Paths
- Hibernate为表字段添加备注信息,便于理解数据库设计
- spring mvc DispatcherServlet详解之前传---前端控制器架构
- C++父类与子类关系以及函数重载、覆盖和隐藏规则
- AVL平衡树
- 资讯_常用命令汇总
- android目录结构01
- java反射机制详解 及 Method.invoke解释 getMethod
- javascript中使用自定义类来扩展内置类的原型
- Android AsyncTask异步处理
- linu 查看网络状态端口占用情况
- 蓝桥杯 概率问题 递归概率计算
- iOS开发之类别、扩展