平衡非 BST
Balancing a non-BST
在算法课程的最近一次测试中,我得到了一个任务,即使用用于重新平衡 AVL 树的方法来平衡一些给定的二叉树。问题是,如果那棵树不是 BST 怎么办?使用旋转有意义吗?我的意思是,你可以使用它们,但似乎没有办法在 "fixing" 之前平衡这样的树,即使其成为 BST。
如果可能的话,是否存在有用的情况?除了带来混乱之外,我似乎找不到任何真正的逻辑。
真正意义的使用BST在于O(logn)的查找和替换每个元素。
如果树不是二叉树,那么查找和替换都是有代价的,这就是为什么我们用AVL来平衡BST的原因,最坏的情况下变成链表。
这些应用程序有时还包括内存管理、进程调度。还有更多。
这真的取决于树代表什么。在谈论二叉搜索树时,树旋转是一个很自然的想法,因为它们代表了一种在保留二叉搜索的同时重塑树的方式 属性。在其他树中,这可能是不可能的。例如,在 k-d tree, which acts somewhat like a BST but works in higher dimensions, rotations aren't possible because a node's level in the tree determines how comparisons against that node works. However, it is possible to rebalance k-d trees by removing a subtree and rebuilding it from scratch. (This idea also can be used in regular BSTs; look up the scapegoat tree 中获取详细信息)。
在其他一些树结构中,例如解析树,旋转的想法根本没有意义,因为树编码的是层次结构而不是顺序。在这些情况下,一棵树可能从根本上是不平衡的,因为它试图代表本身从根本上不平衡的东西。
所以一般来说,不,没有办法将树旋转推广到非 BST,尽管在某些情况下可以谈论更多和更少平衡的树。
在算法课程的最近一次测试中,我得到了一个任务,即使用用于重新平衡 AVL 树的方法来平衡一些给定的二叉树。问题是,如果那棵树不是 BST 怎么办?使用旋转有意义吗?我的意思是,你可以使用它们,但似乎没有办法在 "fixing" 之前平衡这样的树,即使其成为 BST。
如果可能的话,是否存在有用的情况?除了带来混乱之外,我似乎找不到任何真正的逻辑。
真正意义的使用BST在于O(logn)的查找和替换每个元素。 如果树不是二叉树,那么查找和替换都是有代价的,这就是为什么我们用AVL来平衡BST的原因,最坏的情况下变成链表。
这些应用程序有时还包括内存管理、进程调度。还有更多。
这真的取决于树代表什么。在谈论二叉搜索树时,树旋转是一个很自然的想法,因为它们代表了一种在保留二叉搜索的同时重塑树的方式 属性。在其他树中,这可能是不可能的。例如,在 k-d tree, which acts somewhat like a BST but works in higher dimensions, rotations aren't possible because a node's level in the tree determines how comparisons against that node works. However, it is possible to rebalance k-d trees by removing a subtree and rebuilding it from scratch. (This idea also can be used in regular BSTs; look up the scapegoat tree 中获取详细信息)。
在其他一些树结构中,例如解析树,旋转的想法根本没有意义,因为树编码的是层次结构而不是顺序。在这些情况下,一棵树可能从根本上是不平衡的,因为它试图代表本身从根本上不平衡的东西。
所以一般来说,不,没有办法将树旋转推广到非 BST,尽管在某些情况下可以谈论更多和更少平衡的树。