【发布时间】:2018-02-05 04:47:42
【问题描述】:
我正在尝试解决 LeetCode 的以下问题:
https://leetcode.com/problems/kth-smallest-element-in-a-bst/description/
目标是,给定一个 BST,我们必须找出其中第 K 个最小的元素并返回它的值。
我自己可以想出一个O(n) 时空解决方案。但是我在在线帮助下编写的另一个解决方案要好得多:
/**
* 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 kthSmallestUtil(TreeNode* root, int& k) {
if(!root) return -1;
int value=kthSmallestUtil(root->left, k);
if(!k) return value;
k--;
if(k==0) return root->val;
return kthSmallestUtil(root->right, k);
}
int kthSmallest(TreeNode* root, int k) {
return kthSmallestUtil(root, k);
}
};
我已经了解上述解决方案。我也调试过(https://onlinegdb.com/BJnoIkrLM),在29、30、33、37处插入断点。不过还是有点不安,原因如下:
在调用kthSmallestUtil(root->left, k);的情况下,我们传递k的原始值;然后我们(可以理解地)减少当前根的k 的值(因为我们正在按顺序进行遍历)。但是,当我们再次对kthSmallestUtil(root->right, k); 进行递归时,为什么不传递k 的原始值呢?为什么正确的孩子会得到“优惠”待遇——k的递减值?
我知道因为调试k 的值是如何变化的,我们得到了最终的答案。但我正在寻找一些直觉背后使用k 的原始值作为左孩子和@987654333 的递减值@ 为正确的孩子。
【问题讨论】: