返回BST中的Kth最小元素

时间:2017-06-17 23:06:33

标签: c++

我编写了以下代码片段以返回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。另外,请注意我无法编辑功能原型。此外,问题是k1与BST的元素总数之间的有效数字。

2 个答案:

答案 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);
}