【发布时间】:2017-08-25 09:06:47
【问题描述】:
给定一棵有 n 个节点的二叉树,是否可以检查给定的树是否为 BST,时间复杂度为 O(log n)?
【问题讨论】:
-
我觉得这个问题更适合Computer Science ?
标签: tree binary-search-tree computer-science complexity-theory
给定一棵有 n 个节点的二叉树,是否可以检查给定的树是否为 BST,时间复杂度为 O(log n)?
【问题讨论】:
标签: tree binary-search-tree computer-science complexity-theory
如果 n 是节点的数量,那么不需要,因为您至少需要查看所有值一次,因此您至少需要 O(n)。但是,如果您将 n 定义为特殊的东西,例如子树的总数,您就可以实现这一点。 (但是这样做有点愚蠢,因为这有点像说如果你有 100 美分而不是 1 欧元你有更多的钱。它可能看起来更令人印象深刻但也很奇怪并且没有附加值,这只是令人困惑和普通人一起工作,一般人不会这样做)
这是 O(n) 算法:如果是 BST,那么左右树都是 BST,其中所有值都在某个最小值和最大值之间,因此您可以创建一个递归方法有点像这样:
public boolean isBST(subtree, minvalue, maxvalue){
root=root of subtree;
if(root>maxvalue || root<minvalue) return false;
if(has left child)
if(!isBST(left-child-tree, minvalue, rootvalue)) return false;
if(has right child)
if(!isBST(right-child-tree, rootvalue, maxvalue)) return false;
return true;
}
然后你用 isBST(tree, -infinity, +infinity) 调用这个方法。这是伪代码,当然可以更好地实现。
【讨论】: