给定一个包含n个节点的二叉树,是否可以在O(log n)时间复杂度中检查给定树是否为BST?
答案 0 :(得分:0)
如果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)调用此方法。这是伪代码,当然可以更好地实现。