Tree 确定BST上密钥大于整数K的节点数的算法

Tree 确定BST上密钥大于整数K的节点数的算法,tree,binary-tree,binary-search-tree,pseudocode,Tree,Binary Tree,Binary Search Tree,Pseudocode,我在一周前的一次测试中遇到了以下问题。我还没有拿到分数,但我确信我的解决方案没有完全针对问题的所有基本情况 声明如下: 对于二进制搜索树,编写一个算法(使用伪代码),该算法计算密钥大于或等于给定整数k的节点数。您的算法应该在最坏情况下运行O(h),其中h是二叉搜索树的高度 假设给定了一个在时间O(1)内运行的方法subtreeSize(treeNode n),并返回以n为根的子树中的节点数,包括n本身 这是我的解决方案: nbNodesGreaterEqual(treeNode n, int k

我在一周前的一次测试中遇到了以下问题。我还没有拿到分数,但我确信我的解决方案没有完全针对问题的所有基本情况

声明如下:

对于二进制搜索树,编写一个算法(使用伪代码),该算法计算密钥大于或等于给定整数k的节点数。您的算法应该在最坏情况下运行O(h),其中h是二叉搜索树的高度

假设给定了一个在时间O(1)内运行的方法subtreeSize(treeNode n),并返回以n为根的子树中的节点数,包括n本身

这是我的解决方案:

nbNodesGreaterEqual(treeNode n, int k){

    if(n == null) return 0;
    if(n.getValue() >= k) return 1 + substreeSize(n.getRightChild()) + nbNodesGreaterEqual(n.getLeftChild(), k);
    if(n.getValue < k) return nbNodesGreaterEqual(n.getRightChild,k);
}
nbNodesGreaterEqual(树节点n,int k){
如果(n==null)返回0;
如果(n.getValue()>=k)返回1+substresize(n.getRightChild())+nbNodesGreaterEqual(n.getLeftChild(),k);
如果(n.getValue

我的算法完成了吗?另外,有没有办法为不遍历所有节点的常规二叉树(不是BST)编写相同的算法?

假设节点的右子节点持有的密钥大于或等于该节点中存储的密钥。我们的想法是沿着右分支往下走,直到找到一个节点,其密钥大于或等于k。 如果我们发现一个节点的键等于k,我们知道右边的所有节点的键都应该大于k。所以我们取子树的大小。加上1,因为这个节点也需要计数。 如果我们在发现键大于k的节点时停止了右分支,我们知道需要包括右子树,并且可能在左子树中找到一些可接受的节点。所以我们在左子树上递归调用函数。最后,添加1,因为这个节点也应该被计数。 基本情况是当节点为null时,我们返回0

ksum(node, k)      
  x = 0
  node==null
      return 0
  if node->key < k
     x = ksum(node->right, k)
  else if node->key == k
     x = subtreesize(node->right) + 1
  else
     x = subtreesize(node->right) + ksum(node->left, k) + 1

  return x
ksum(节点,k)
x=0
节点==null
返回0
如果节点->键右侧,k)
否则,如果节点->键==k
x=子树化(节点->右侧)+1
其他的
x=子树化(节点->右)+ksum(节点->左,k)+1
返回x

subtreeSize()
仅当您在树中存储和更新高度信息时才会使用
O(h)
。否则它将是一个
O(n)
操作,其中n是树中的节点数(即
n=O(2^h)
)。噢!我忘了提到这个语句说我们应该假设subtreeSize()在O(1)中运行,但是您不会考虑左节点可能仍然比它们的键“k”大的可能性。这可能发生在如下树中:假设我们希望键的数量大于8,然后根据您所说的,我们只需在节点“21”上使用子树方法,并由于节点“12”而添加1,但您将忽略大于8的节点“9”!