【问题标题】:Balancing a non-BST平衡非 BST
【发布时间】:2016-06-20 17:45:02
【问题描述】:
在最近的算法课程测试中,我的任务是使用用于重新平衡 AVL 树的方法来平衡某些给定的二叉树。问题是,如果那棵树不是 BST 怎么办?使用旋转有意义吗?我的意思是,你可以使用它们,但似乎没有办法在“修复”它之前平衡这种树,即使其成为 BST。
如果这是可能的,在什么情况下这会很有用?除了带来混乱之外,我似乎找不到任何真正的逻辑。
【问题讨论】:
标签:
data-structures
tree
binary-tree
binary-search-tree
avl-tree
【解决方案1】:
这实际上取决于树代表什么。在谈论二叉搜索树时,树旋转是一个自然的想法,因为它们代表了一种在保留二叉搜索属性的同时重塑树的方式。在其他树中,这可能是不可能的。例如,在 k-d tree 中,它有点像 BST,但在更高维度上工作,旋转是不可能的,因为树中节点的级别决定了与该节点的比较如何工作。但是,可以通过删除子树并从头开始重建它来重新平衡 k-d 树。 (这个想法也可以用于常规的 BST;查看scapegoat tree 了解详细信息)。
在其他一些树结构中,例如解析树,旋转的想法根本没有意义,因为树编码的是层次结构而不是排序。在这些情况下,树可能根本不平衡,因为它试图表示本身根本不平衡的东西。
所以一般来说,不,没有办法将树旋转推广到非 BST,尽管在某些情况下可能会讨论更多和更少平衡的树。
【解决方案2】:
使用 BST 的真正意义在于 O(logn) 搜索和替换每个元素。
如果树不是二叉树,那么查找和替换的代价是很大的,这就是为什么我们使用 AVL 作为 BST 来平衡的原因,它在最坏的情况下变成了 Linked List。
这些应用程序还包括内存管理、进程调度有时。还有更多。