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