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个数据来测试可以保持平衡。添加+删除+打印时间几秒。