剑指OFFER题46------按牛客网通过率排序
时间:2019.1.5.1624
作者:Waitt
题目
给定一棵二叉搜索树,请找出其中的第k小的结点。例如, (5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4。
时间限制:1秒 空间限制:32768K 热度指数:146968
解答
中序遍历二叉搜索树得到的则为一个有序的数组。
因此,通过中序遍历二叉搜索树则可得到结果
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};
*/
class Solution {
public:
//中序遍历函数,j与pp均为引用,因为需要随时改变其值
void zhong(TreeNode* pRoot, int k,int &j,TreeNode* &pp)
{
if(!pRoot)
return;
zhong(pRoot->left,k,j,pp);
j++;
if(j==k)
{
pp=pRoot;
return;
}
if(j>k)
return;
zhong(pRoot->right,k,j,pp);
}
TreeNode* KthNode(TreeNode* pRoot, int k)
{
int j=0;
TreeNode* pp=NULL;
if(k<1)
return pp;
zhong(pRoot,k,j,pp);
return pp;
}
};
精简版
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};
*/
class Solution {
public:
int j=0;
TreeNode* KthNode(TreeNode* pRoot, int k)
{
if(!pRoot)
return NULL;
if(k<1)
return NULL;
TreeNode* pp=KthNode(pRoot->left,k);
if(pp)
return pp;
j++;
if(j==k)
{
pp=pRoot;
return pp;
}
pp=KthNode(pRoot->right,k);
return pp;
}
};