AVL平衡树

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平衡树)