题目描述
描述:给定一棵结点数为n 二叉搜索树,请找出其中的第 k 小的TreeNode结点值。
1.返回第k小的节点值即可;
2.不能查找的情况,如二叉树为空,则返回-1,或者k大于n等等,也返回-1;
3.保证n个节点的值不一样;
数据范围: 0≤n≤1000,0≤k≤1000,树上每个结点的值满足0≤val≤1000。
进阶:空间复杂度 O(n),时间复杂度 O(n)。
如输入{5,3,7,2,4,6,8},3时,二叉树{5,3,7,2,4,6,8}如下图所示:
该二叉树所有节点按结点值升序排列后可得[2,3,4,5,6,7,8],所以第3个结点的结点值为4,故返回对应结点值为4的结点即可。
输入:{5,3,7,2,4,6,8},3
返回值:4
输入:{},1
返回值:-1
解题思路
二叉搜索树的第k个节点:最直观的想法是,中序遍历二叉搜索树,这样得到的遍历结果是有序的,使用一个变量num表示当前距离第k个节点还剩几个节点,其初始为k,使用一个变量value表示第k个节点值,其初始为-1。在中序遍历的过程中,将num减一,并且判断当前num是否等于0,如果是则返回当前节点对应的值,即value等于cur->val。
int num=0;
int value=-1;
void InOrder(TreeNode* cur)
{
// 空节点返回
if(cur==nullptr)
return;
InOrder(cur->left);
// 中间节点
num--;
if(num==0)
value=cur->val;
InOrder(cur->right);
}
int KthNode(TreeNode* proot, int k) {
num=k;
InOrder(proot);
return value;
}