【问题标题】: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。

      这些应用程序还包括内存管理、进程调度有时。还有更多。

      【讨论】:

        猜你喜欢
        • 2012-04-09
        • 1970-01-01
        • 2012-05-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-06-15
        • 2021-10-28
        相关资源
        最近更新 更多