题目描述
给定一棵二叉搜索树,请找出其中的第k小的结点。例如(5,3,7,2,4,6,8)中,按结点数值大小顺序第三小结点的值为4。
方法一
设置一个计数器为私有变量,中序遍历,当遍历到第k个节点时,将此节点的信息返回。
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};
*/
class Solution {
public:
TreeNode* KthNode(TreeNode* pRoot, int k)
{
if(k<=0||pRoot==NULL)
return NULL;
TreeNode* point=NULL;
count=k;
Middle(pRoot,point);
return point;
}
void Middle(TreeNode* root,TreeNode *&point)
{
if(root==NULL)
return;
Middle(root->left,point);
count--;
if(count==0)point=root;
Middle(root->right,point);
}
private:
int count;
};
方法二
中序遍历找到第k个节点的时候,遍历结束,返回这个节点给调用函数。
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};
*/
class Solution {
public:
TreeNode* KthNode(TreeNode* pRoot, int k)
{
if(k<=0||pRoot==NULL)
return NULL;
return Middle(pRoot, k);
}
TreeNode* Middle(TreeNode* root,int &k)
{
TreeNode* point=NULL;
if(root->left!=NULL)
point=Middle(root->left,k);
if(k==1)
point=root;
k--;
if(point==NULL&&root->right!=NULL)
point=Middle(root->right,k);
return point;
}
};