返回 BST 中的第 K 个最小元素

Returning Kth smallest element in a BST

本文关键字:元素 BST 返回      更新时间:2023-10-16

我编写了以下代码片段来返回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:在BST中查找第K个最小元素。 另外,请注意,我无法编辑函数原型。 此外,该问题表明k将是1和 BST 元素总数之间的有效数字。

变量在(递归或不递归)调用之间不共享。每次调用都将k是一个普通的局部变量,一旦函数返回,其值就会立即被遗忘。

如果您有k == 1然后执行kthSmallest(root->left, k-1)则仅在递归调用中k == 0。在被调用方中,k的值1

此算法永远不会按编码工作,因为您依赖于共享的参数和局部变量。

您也不会从调用树的底部传播 K:th 最小值。你只是把它扔掉,最后(第一次调用kthSmallest)不会返回任何导致未定义行为的东西。

您的代码不会像上一条评论那样按原样工作。 您可以执行以下操作:

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