在最近的算法课程测试中,我得到了一项任务,即使用用于重新平衡AVL树的方法来平衡某些给定的二叉树。问题是,如果那棵树不是BST怎么办?使用旋转是否有意义?我的意思是,你可以使用它们,但似乎没有办法在“修复”它之前平衡这种树。使它成为BST。
如果可能的话,是否存在这种情况有用的情况?我似乎无法找到任何真正的逻辑,除了引起混乱。
答案 0 :(得分:1)
这实际上取决于树代表什么。在讨论二叉搜索树时,树旋转是一种自然的想法,因为它们代表了一种在保留二进制搜索属性的同时重塑树的方法。在其他树木中,这可能是不可能的。例如,在k-d tree中,其行为有点像BST但在更高维度上工作,旋转是不可能的,因为树中的节点级别确定与该节点的比较是如何工作的。但是,可以通过删除子树并从头开始重建来重新平衡k-d树。 (这个想法也可以在常规BST中使用;查看scapegoat tree以获取详细信息。)
在一些其他树结构中,例如解析树,旋转的概念根本没有意义,因为树编码层次而不是排序。在这种情况下,树可能从根本上是不平衡的,因为它试图表示本身从根本上是不平衡的东西。
所以一般情况下,没有,没有办法将树木轮换推广到非BST,尽管在某些情况下可能会谈论更多和更少平衡的树木。
答案 1 :(得分:0)
使用BST的真正意义在于O(logn)搜索并替换每个元素。 如果树不是二进制,那么搜索和替换是昂贵的,这就是我们使用AVL来平衡BST的原因,BST在最坏的情况下成为链接列表。
应用程序还包括内存管理,进程调度somtimes。还有更多。