【问题标题】:Algorithm for determining the number of nodes with a key greater than an integer K on a BST用于确定 BST 上密钥大于整数 K 的节点数的算法
【发布时间】:2018-02-13 19:14:25
【问题描述】:

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

声明如下:

对于二叉搜索树,编写一个算法(使用伪代码)计算具有大于或等于给定整数 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)编写相同的算法?

【问题讨论】:

  • subtreeSize() 仅当您在树中存储和更新高度信息时才会采用 O(h)。否则它将是一个O(n) 操作,其中n 是树中的节点数(即n = O(2^h))。
  • 哦!我忘了提到声明说我们应该假设 subtreeSize() 在 O(1) 中运行

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


【解决方案1】:

假设一个节点的右孩子拥有一个大于或等于存储在该节点中的密钥的密钥。这个想法是沿着正确的分支走,直到我们找到一个 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

【讨论】:

  • 但是您不会考虑左节点可能仍然大于它们的键“k”的可能性。这可能发生在如下树中:algolist.net/img/bst-remove-case-3-3.png 假设我们想要大于 8 的键数,然后根据您所说的,我们只需在节点 '21' 上使用子树方法并添加 1,因为节点“12”,但您将忽略大于 8 的节点“9”!
猜你喜欢
  • 2022-07-22
  • 2021-01-08
  • 1970-01-01
  • 2020-03-18
  • 2011-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-15
相关资源
最近更新 更多