问题实际上是中序遍历,但我还是犯迷了一会
class Solution {
public:
TreeNode* res=NULL;
int i=0;
void findk(TreeNode *root ,int k)
{
if(!root)
return;
findk(root->left,k);
//递归方法在找到之后仍然会遍历,所以加上下面一句可以起到提前中断的效果,注意要在i++之前;
// if (i==k) return;
i++;
if(i==k) res=root;
findk(root->right,k);
}
int kthSmallest(TreeNode* root, int k) {
findk(root,k);
return res->val;
}
};
学习了答案使用栈的解法,唉,实际上还是书上的迭代中序遍历方法。没学到家
class Solution {
public:
int kthSmallest(TreeNode* root, int k) {
stack<TreeNode*> s;
while(1)
{
while(root)
{
s.push(root);
root=root->left;
}
root=s.top();
s.pop();
--k;
if(!k) return root->val;
root=root->right;
}
}
};