我一直在阅读关于AVL树的文献,并且发现在AVL树插入/删除中需要多少次平衡检查时没有详细说明。
例如,在插入节点之后,我们是否需要检查从新节点到根节点的平衡?或者我们可以在提交轮换后停止吗?
在删除左侧子树中复制最右边节点的策略时怎么样?从新删除的(左侧子树中最右边的节点)节点到根节点进行检查?我们可以在提交轮换后停止吗?
答案 0 :(得分:1)
插入后,您需要在树的所有方向上更新每个“父”的平衡因子,直到根;所以它是O(log n)更新的最大值。但是你只需要进行一次重组就可以将树恢复到它的不变量。
删除后,如插入,您必须在树上一直更新平衡因子;所以再次是O(log n)更新。但是,与插入不同,您可以 进行多次重组旋转,以将树恢复为不变量。
答案 1 :(得分:-1)
我一直在深入搜索,我发现你什么时候可以停止检查:
http://www.superstarcoders.com/blogs/posts/efficient-avl-tree-in-c-sharp.aspx
http://www.eternallyconfuzzled.com/tuts/datastructures/jsw_tut_avl.aspx