解题思路:中序遍历,计数统计第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:
void inOrder(TreeNode* root, int& k,int &s,int &result){
if (root->left){
inOrder(root->left, k,s,result);
}
s+=1;
if(s==k){
result =root->val;
return;
}
if (root->right){
inOrder(root->right, k,s,result);
}
}
int kthSmallest(TreeNode* root, int k) {
if (root == NULL)return 0;
int s=0;
int result=0;
inOrder(root,k,s,result);
return result;
}
};
非递归方法
/**
* 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) {
stack<TreeNode*> stk;
if(root==NULL)return 0;
stk.push(root);
int cnt=0;
while(!stk.empty())
{
TreeNode* p = stk.top();
if(p->left)
{ stk.push(p->left);
p->left=NULL; //标记为已经访问
}
else{
cnt++;
if(cnt==k)return p->val;
stk.pop();
if(p->right)
stk.push(p->right);
}
}
return 0;
}
};