题目描述
给定一棵二叉搜索树,请找出其中的第k小的结点。例如, (5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4。
/*
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)
{
}
};
二叉搜索树的中序结果就是顺序的,二叉树的中序结果不一定是顺序的,如果是二叉树的话就要考虑大根堆。
/*
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(!pRoot || k<1)
return NULL;
TreeNode *ans = NULL;
count = k;
inorder(pRoot, ans);
return ans;
}
void inorder(TreeNode *root, TreeNode *&ans)
{
if(root)
{
inorder(root->left, ans);
count--;
if(!count)
ans = root;
inorder(root->right, ans);
}
}
private:
int count;
};
利用vector按中序遍历存储结点, 取出第k个结点
class Solution {
public:
TreeNode* KthNode(TreeNode* pRoot, int k)
{
if(pRoot == NULL || k<1)
return NULL;
vector<TreeNode *> vec;
Inorder(pRoot, vec);
if(k>vec.size())
return NULL;
return vec[k-1];
}
void Inorder(TreeNode *root, vector<TreeNode*> &vec)
{
if(root == NULL)
return;
Inorder(root->left, vec);
vec.push_back(root);
Inorder(root->right, vec);
}
};