【问题标题】:Is Binary Search tree balanced?二叉搜索树是否平衡?
【发布时间】:2012-08-23 08:42:48
【问题描述】:

这已经在here 讨论过,但我在下面有一个实现(线程中从未讨论过),

public boolean isBalanced(BSTNode node) {
    if(maxHeight() > (int)(Math.log(size())/Math.log(2)) + 1) 
        return false;
    else
        return true;
}

其中 maxHeight() 返回树的最大高度。基本上我正在检查 maxHeight > log(n),其中 n 是树中元素的数量。这是一个正确的解决方案吗?

【问题讨论】:

  • 您似乎没有使用node 并且您不需要if() 语句,您可以只返回布尔值。否则它看起来很适合 自平衡二叉树 en.wikipedia.org/wiki/Self-balancing_binary_search_tree
  • 是的,这段代码是从另一个函数中复制而来的,然后添加了一个名称 isBalanced。这就是我不使用节点的原因。
  • 正如阿米特所说,这将确定树是否具有最小平衡高度。它可能比这更高,但仍然是平衡的。
  • 哦,我明白了,我对平衡树的定义是“最小高度”。所以实际的定义是“树中的任何节点都应该有高度相同或相差 1 的子树”
  • 公平地说,平衡树的最大高度总是大于 log(n)。如果你有三个元素,这意味着你有两个元素,log(3) = 1.6 和 log(7) = 2.8(3 级深)。这是您在计算中添加 1 的原因吗?

标签: java algorithm data-structures tree binary-tree


【解决方案1】:

此解决方案不正确。如果高度为O(lg(n)),则平衡树是平衡的,因此它(高度)需要小于c*lg(n) - 对于某些常数c。您的解决方案假定此常数为 1。

请注意,只有 complete tree 的高度正好为 lg(n)

Fibonacci tree 为例,它一棵平衡树(实际上是AVL tree 的最坏情况)。但是 - 它的高度大于 lgn (~1.44*lg(n)),并且建议的算法将返回不平衡的斐波那契树。

【讨论】:

  • @PeterLawrey:我看不出它与它有何矛盾。 OP 询问仅返回高度为 logn 的树的算法是否平衡 - 是否正确。这向他表明事实并非如此,并举了一个反例。请注意,斐波那契树是 AVL 树的特例,它是自平衡 BST。
  • 该公式计算的是最小高度,而不是 > 所暗示的最大值。 始终将高度保持在其最小值 floor(log_2(n)) 并不总是可行的。可以证明,任何这样做的插入算法都会产生过多的开销。因此,大多数自平衡 BST 算法将高度保持在此下限的恒定因子内。 -- 来自 wiki 页面。
  • @PeterLawrey:不过,最小高度还是大于log_2(n)floor(log_2(n)) 并不总是可行的 - 必须保留一个常数因子,但这个常数绝对不是 1。我仍然无法理解您要指出的内容。一个平衡的 BST 可以平衡,即使它比lg_2(n) 大 - 这就是我想要展示的。由于斐波那契树是一种特定类型的 AVL 树,它是平衡 BST 的一个可行示例,其高度大于lg_2(n),并且仍然是平衡的。
  • 是的,我说的是二叉搜索树。
猜你喜欢
  • 1970-01-01
  • 2013-12-18
  • 1970-01-01
  • 2012-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多