题目描述
给定一棵二叉搜索树,请找出其中的第k小的结点。例如, (5,3,7,2,4,6,8)中,按结点数值大小顺序第三小结点的值为4。
二叉搜索树的中序遍历即是有序的,按从小到大的顺序排列的。
解法一:
可以选择全部遍历二叉树,把结果存下来,再找出第K个节点。当然,这是比较简单但是会做很多无用功。那有没有一种方法,可以直接一步到位那?
关于这种解法,记得排除特殊情况(1)pRoot == null; (2)K <= 0
解法二:
在遍历的同时计数,这里可以采用两种方式计数
- 定义一个数据成员count,使用默认的构造函数,借用牛客代码
- 在函数内定义一个static变量count(不明白为什么无法通过)
链接:https://www.nowcoder.com/questionTerminal/ef068f602dde4d28aab2b210e859150a
来源:牛客网
class Solution {
int count = 0;
public:
TreeNode* KthNode(TreeNode* pRoot, unsigned int k)
{
if(pRoot){
TreeNode *ret = KthNode(pRoot->left, k);
if(ret) return ret;
if(++count == k) return pRoot;
ret = KthNode(pRoot->right,k);
if(ret) return ret;
}
return nullptr;
}
};
关于使用静态局部变量count来计数报错的问题,实在想不明白,希望大神解惑。。。