时间限制:1秒 空间限制:32768K 热度指数:280550
题目描述
给定一棵二叉搜索树,请找出其中的第k小的结点。例如, (5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4。
题目链接:题目链接
这里要知道二叉搜索树的中序遍历结果就是有序的,所以这题就是求中序遍历的第k个节点。
所以在中序遍历时加个index表示当前为第几个节点,当index = k的时候输出,这个很容易想到。
递归终止条件:
1.当前节点为NULL,返回NULL。
2.当前节点为第k个节点,返回当前节点。
3.(这个最重要,也最难想到)当前节点补位NULL且不为第k个节点,
如果其左递归不为NULL,返回左递归的返回值,
如果其右递归不为NULL,返回右递归的返回值。
这相当于找到第k个节点,然后一层层把返回值传出。
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};
*/
class Solution {
public:
int index = 0;//这里注意index定义得在函数外,如果在函数里,当函数结束后,index的值会释放,即index会回到上层函数的index值
TreeNode* KthNode(TreeNode* pRoot, int k)
{
index = 0;
return KNode(pRoot, k);
}
TreeNode* KNode(TreeNode* pRoot, int k)
{
if(pRoot == NULL)
return NULL;
TreeNode* temp1 = KNode(pRoot->left, k);
if(temp1 != NULL)
return temp1;
index ++ ;
if(index == k)
return pRoot;
TreeNode* temp2 = KNode(pRoot->right, k);
if(temp2 != NULL)
return temp2;
}
};