返回 BST 中的第 K 个最小元素
Returning Kth smallest element in a BST
我编写了以下代码片段来返回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);
}
相关文章:
- Mongodb c++驱动程序:如何查询元素的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 使用strcpy将char数组的元素复制到另一个数组
- 使用不带参数的函数访问结构元素
- 给定n个元素的m个集合.在C++中找到出现在最大集合数中的元素
- C++如何通过用户输入删除列表元素
- lower_bound()返回最后一个元素
- 基于多个条件处理地图中的所有元素
- 如何在给定特定节点的BST中找到直接较大的元素
- BST 不添加元素
- 删除元素 BST
- 返回 BST 中的第 K 个最小元素
- 如何将元素插入 BST
- 从 BST 中删除元素(指针错误)
- 使用BST的多数元素
- BST 递归解中的第 k 个最小元素
- 时间和空间复杂性在二叉树的每个级别创建元素向量(NON-BST)
- 从BST中删除重复元素
- 中缀,前缀或后缀顺序通过BST得到降序打印元素
- 如何找到BST的某个元素,给定关键字