我在一周前的测试中遇到了以下问题。我没有拿回我的成绩,但我确信我的解决方案没有完全针对问题的所有基本情况。
声明如下:
对于二进制搜索树,编写一种算法(使用伪代码),该算法使用大于或等于给定整数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)编写相同的算法?
答案 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