【问题标题】:Kth Smallest Element in a BST recursive solutionBST 递归解决方案中的第 K 个最小元素
【发布时间】:2016-04-27 23:56:17
【问题描述】:

此代码用于返回 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,它将返回 2 而不是 1。 我无法弄清楚为什么两个代码不同。感谢您的帮助!

【问题讨论】:

    标签: c++ algorithm recursion binary-search-tree


    【解决方案1】:

    int& k(按引用)和int k(按值)作为参数有很大区别。

    在第一种情况下,对k(例如k--)所做的任何更改都会反映在作为参数传递的调用函数的变量中。

    在第二种情况下,函数接收自己的k 副本,对其所做的任何更改都不会影响调用函数。

    您可以更改您的 kthSmallest 以将 k 作为参考 (int &),但这会改变您被允许调用它的方式。您可能仍然需要一个辅助函数,但您可以将所有代码放入其中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-02
      • 1970-01-01
      • 1970-01-01
      • 2014-12-07
      • 1970-01-01
      • 2013-01-04
      • 1970-01-01
      • 2019-08-13
      相关资源
      最近更新 更多