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

时间:2013-11-09 14:21:10

标签: tree binary-tree binary-search-tree pseudocode

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

声明如下:

对于二进制搜索树,编写一种算法(使用伪代码),该算法使用大于或等于给定整数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);
}

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

1 个答案:

答案 0 :(得分:0)

假设节点的右子节点持有的密钥大于或等于存储在该节点中的密钥。我们的想法是沿着正确的分支走下去,直到我们找到一个密钥大于或等于k的节点。 如果我们找到一个密钥等于k的节点,我们知道右边的所有节点都应该有大于k的密钥。所以我们采用该子树的大小。添加1,因为此节点也需要计数。 如果我们在找到密钥大于k的节点时停止向右走向分支,我们知道需要包含正确的子树,并且可能在左子树中找到一些可接受的节点。所以我们在左子树上递归调用该函数。最后,添加1,因为此节点也应计数。  基本情况是当节点为空时,我们返回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