我编写了以下代码片段以返回BST中K
个最小元素:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
int kthSmallest(TreeNode* root, int k) {
if(root==NULL)
return -2;
cout<<"Root value "<<root->val<<" and k value "<<k<<"\n";
kthSmallest(root->left, k-1);
if((k)==0)
return root->val;
kthSmallest(root->right, k-1);
}
};
我基本上只是对树进行顺序遍历,并在每次递归调用期间减少k
的值。因此,通过这种方式,当k
的值等于0
时,我找到了节点并返回它。
以下是我的调试语句的输出:
根值1和k值3
根值2和k值2
根值4和k值1
根值8和k值0
根值9和k值0
根值5和k值1
根值10和k值0
根值11和k值0
根值3和k值2
根值6和k值1
根值12和k值0
根值7和k值1
我无法理解为什么即使在k
成为0
之后程序仍继续执行。我错过了什么?我感谢您的帮助。
修改:我不认为问题描述是必需的,但如果需要,可以在此处找到:LeetCode: Find Kth smallest element in a BST。另外,请注意我无法编辑功能原型。此外,问题是k
是1
与BST的元素总数之间的有效数字。
答案 0 :(得分:0)
(递归或非递归)调用之间不共享变量。每次调用都会将k
作为一个普通的局部变量,一旦函数返回就会立即忘记它的值。
如果您有k == 1
然后执行kthSmallest(root->left, k-1)
,则只能在递归调用中k == 0
。在被调用者中,k
的值仍 1
。
此算法永远不会像编码一样工作,因为您依赖于参数和本地变量共享。
您也不会从调用树的底部传播K:th最小值。你只是扔掉它,最后(第一次调用kthSmallest
)不返回任何导致未定义的行为。
答案 1 :(得分:0)
您的代码将无法正常工作,就像之前的评论一样。 你可以做一些事情:
int kthSmallest(TreeNode* root, int k) {
int i = 0;
return kthSmallest(root, &i, k);
}
int kthSmallest(TreeNode* root, int *i, int k) {
if(root == nullptr)
return INT32_MAX;
int left = kthSmallest(root->left, i, k);
if (left != INT32_MAX)
return left;
if (++*i == k)
return root->val;
kthSmallest(root->right, i, k);
}