【问题标题】:Space complexity of validation of a binary search tree二叉搜索树验证的空间复杂度
【发布时间】:2014-02-28 01:48:44
【问题描述】:

验证二叉树是否为 BST 的最佳算法如下所示

IsValidBST(root,-infinity,infinity);

bool IsValidBST(BinaryNode node, int MIN, int MAX) 
{
    if(node == null)
        return true;
    if(node.element > MIN 
        && node.element < MAX
        && IsValidBST(node.left,MIN,node.element)
        && IsValidBST(node.right,node.element,MAX))
        return true;
    else 
        return false;
}

这个逻辑的空间复杂度显然是O(logN),我假设这是递归的成本。价值是如何得出的?

【问题讨论】:

  • 除了方法变量和返回值之外,没有使用额外的数据,所以确实,所有的内存都是“递归成本”。因此,总成本将与树的深度成线性比例。在一个平衡二叉搜索树中,深度是O(log n),所以实际上,空间复杂度也是O(log n)。但是,通常 BST 不一定是平衡的,它甚至可以是长度为n 的链,如果根是最小的,它的右孩子是第二小的元素,依此类推。在这种情况下,这个递归的空间复杂度是O(n)
  • @Heuster 好评论,但它确实应该是答案。
  • 这个问题与c或c++有什么关系?你用什么语言在这里有什么关系吗?
  • @user694733 我猜你是对的 :-)
  • 注意:如果每个节点都有一个指向其父节点的指针,则可以在 O(1) 中完成,因为您可以在不维护堆栈的情况下进行迭代。所以它完全取决于如何二叉树的表示。

标签: c++ c algorithm binary-search-tree


【解决方案1】:

我的评论升级为回答:

除了方法变量和返回值之外,没有使用其他数据,所以实际上,所有内存都是“递归成本”。因此,总成本将与树的深度成线性比例。

在一个平衡二叉搜索树中,深度是O(log n),所以实际上,空间复杂度也是O(log n)。但是,通常 BST 不一定是平衡的,它甚至可以是长度为 n 的链,如果根是最小的,它的右孩子是第二小的元素,依此类推。在这种情况下,这个递归的空间复杂度是O(n)

【讨论】:

  • 但是你不是在每个节点的递归堆栈中添加一个条目吗?不管 BST 是如何构造的,这不是 O(n) 吗?
  • 当递归函数到达叶节点时,堆栈被清理。因此,如果树是平衡的,堆栈将永远不会比 log n 深。
  • 谢谢,但是我们在 BST 的两边都有元素,那为什么是O(log n)
  • @avra,请参阅您上面的 Mats 评论。元素在“向上”的过程中从堆栈中弹出,因此堆栈的大小不会超过树的深度。
  • @VincentvanderWeele。非常感谢!所以最后一个问题是,当我们检查每个节点的左右子树时,为什么我们应该有O(log n) 的复杂性?如果我们有n节点,那么我们应该有O(nlog n)强制检查BST的有效性,如果我错了,请纠正? (这是针对上述情况的暴力解决方案)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多