以下是我要解决的问题: 在二进制搜索树中找到第k个最小整数:
我的算法:我将对BST进行顺序遍历。每次我访问节点时,我都会将k减1,当k = 0时,我应该在第k个最小节点。
这是我的实施:
void FindKthSmallest(struct TreeNode* root, int k)
{
if (root == NULL) return;
if (k== 0) return;
FindKthSmallest (root->left, k);
k--;
if (k == 0)
{
cout << root->data;
return;
}
FindKthSmallest (root->right, k);
}
然而,通过上述实现,我发现在递归调用之间不能保持k的状态。
我认为k的状态需要在两种情况下维持:子和父之间的递归调用返回以及父对子之间的递归调用 - 这是我正在努力的地方。有没有办法在这种情况下维持状态?
答案 0 :(得分:0)
在您的实现中,您使用变量k
传递两条不同的信息:
缺少的只是2.你可以通过以下方式实现这一目标:
i)传递k
作为参考而不是值。
ii)通过0
的值k
指定上述2.)的含义。
结果如下:
void FindKthSmallest(struct TreeNode* root, int& k)
{
if (root == NULL) return;
if (k == 0) return; // k==0 means target node has been found
FindKthSmallest (root->left, k);
if (k > 0) // k==0 means target node has been found
{
k--;
if (k == 0) { // target node is current node
cout << root->data;
return;
} else {
FindKthSmallest (root->right, k);
}
}
}
另请注意,上述实施是O(k)
。使用BST,您实际上可以在查找k-th
最小整数时获得更好的性能。