题目大意:给出一颗二叉搜索树,找出其中第K小的数。
算法思想:
由二叉搜索树和中序遍历的性质可知,中序遍历二叉搜索树的结果是从小到大递增的序列,从而只需找到中序遍历的过程中的第K个节点即可。
中序遍历算法:
对于任意节点P,只要P不空则将其入栈,并指向其左孩子节点,直至P为空,然后取栈顶顶元素并出栈,然后对其右子树做上述同样的操作。按此过程重复直到栈为空为止。
代码如下:
/**
* 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) {
int res=0,num=0;
if(root==NULL) return 0;
TreeNode* p=root;
stack<TreeNode*> S;
while(p!=NULL||!S.empty()){
while(p!=NULL){
S.push(p);
p=p->left;
}
if(!S.empty()){
p=S.top();
++num;
if(num==k) {
res=p->val;
break;
}
S.pop();
p=p->right;
}
}
return res;
}
};