题目:二叉搜索树的第k个结点
题目描述
给定一棵二叉搜索树,请找出其中的第k小的结点。例如, (5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4。
最优思路:二叉搜索树按照中序遍历的顺序打印出来正好就是排序好的顺序。
class Solution{
public:
int index=0;
TreeNode* KthNode(TreeNode* pRoot, int k)
{
if(pRoot){
TreeNode * node = KthNode(pRoot->left, k);
if(node) return node;
index++;
if(index==k) return pRoot;
node = KthNode(pRoot->right, k);
if(node) return node;
}
return NULL;
}
};
思路②vector<int> v,v_node 分别记录值,和树的节点;在v中找出第k小的,return v_node[i];注意边界,否则会报错
class Solution{
public:
vector<int> v;
vector<TreeNode *> v_node;
void dfs(TreeNode *r){
if(r!=NULL){
v.push_back(r->val);
v_node.push_back(r);
}
if(r->left)
dfs(r->left);
if(r->right)
dfs(r->right);
}
TreeNode* KthNode(TreeNode* pRoot, int k)
{
v.clear();
v_node.clear();
if(pRoot==NULL) return NULL;
dfs(pRoot);
if(k<=0 || k>v.size()) return NULL;
vector<int> copy_v = v;
sort(v.begin(),v.end());
for(int i=0;i<copy_v.size();i++){
if(copy_v[i]==v[k-1]){
return v_node[i];
}
}
}
};