0

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

声明如下:

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

假设给定一个方法 subtreeSize(treeNode n),它在 O(1) 时间内运行,并返回以 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)编写相同的算法?

4

1 回答 1

0

假设一个节点的右孩子拥有一个大于或等于存储在该节点中的密钥的密钥。这个想法是沿着正确的分支走,直到我们找到一个其 key 大于或等于 k ​​的节点。如果我们找到一个 key 等于 k ​​的节点,我们知道右边的所有节点都应该有大于 k 的 key。所以我们取那个子树的大小。加上 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
于 2013-11-09T15:01:38.773 回答