BST 递归解决方案中的第 K 个最小元素
Kth Smallest Element in a BST recursive solution
此代码是 return 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 fid;
void inorder(TreeNode* node, int& fid, int& k) {
if (!node) return;
inorder(node->left, fid, k);
if (!k) return;
fid = node->val;
k--;
inorder(node->right, fid, k);
}
int kthSmallest(TreeNode* root, int k) {
inorder(root, fid, k);
return fid;
}
};
给出了正确答案。
我想我可以通过将 inorder 函数和 kthSmallest 函数组合在一起来简化代码。
class Solution {
public:
int fid;
int kthSmallest(TreeNode* root, int k) {
if (!root) return fid;
kthSmallest(root->left, k);
if (!k) return fid;
fid = root->val;
k--;
kthSmallest(root->right, k);
return fid;
}
};
它给出了错误的答案。如果我输入 BST{2,1} k=1,它将 return 2 而不是 1。
我无法弄清楚为什么两个代码不同。感谢您的帮助!
int& k
(by reference)和int k
(by value)作为参数有很大区别。
在第一种情况下,对 k
(例如 k--
)所做的任何更改都会反映在作为参数传递的调用函数的变量中。
在第二种情况下,该函数接收它自己的 k
副本,对其所做的任何更改都不会影响调用函数。
您可以更改 kthSmallest
以将 k
作为参考 (int &
),但这会改变允许您调用它的方式。您可能仍然需要辅助函数,但您可以将所有代码放入其中。
此代码是 return 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 fid;
void inorder(TreeNode* node, int& fid, int& k) {
if (!node) return;
inorder(node->left, fid, k);
if (!k) return;
fid = node->val;
k--;
inorder(node->right, fid, k);
}
int kthSmallest(TreeNode* root, int k) {
inorder(root, fid, k);
return fid;
}
};
给出了正确答案。 我想我可以通过将 inorder 函数和 kthSmallest 函数组合在一起来简化代码。
class Solution {
public:
int fid;
int kthSmallest(TreeNode* root, int k) {
if (!root) return fid;
kthSmallest(root->left, k);
if (!k) return fid;
fid = root->val;
k--;
kthSmallest(root->right, k);
return fid;
}
};
它给出了错误的答案。如果我输入 BST{2,1} k=1,它将 return 2 而不是 1。 我无法弄清楚为什么两个代码不同。感谢您的帮助!
int& k
(by reference)和int k
(by value)作为参数有很大区别。
在第一种情况下,对 k
(例如 k--
)所做的任何更改都会反映在作为参数传递的调用函数的变量中。
在第二种情况下,该函数接收它自己的 k
副本,对其所做的任何更改都不会影响调用函数。
您可以更改 kthSmallest
以将 k
作为参考 (int &
),但这会改变允许您调用它的方式。您可能仍然需要辅助函数,但您可以将所有代码放入其中。