剑指OFFER_二叉搜索树的第k个节点
剑指OFFER_二叉搜索树的第k个节点
题目描述
给定一棵二叉搜索树,请找出其中的第k小的结点。例如, (5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4。
思路
对二叉搜索树进行排序,很自然就想到了中序遍历,即先输出左子树,然后根节点,最后右子树;
那么要输出第k小的节点,就需要在最左边的节点开始计数,回溯到第k个时输出即可;
那么为了从最小的节点开始计算,设置一个flag,当搜索到底层的时候设置flag,开始计数;
然后当计数器达到k的时候,保存此节点并退出;
不过程序还有待优化的地方,就是这里推出后,还会有后续的节点会继续遍历,可以考虑设置一个开关跳出递归;
代码
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};
*/
class Solution {
public:
int t = 0, k = 0;
bool flag = false;
TreeNode* ans = NULL;
void dfs(TreeNode* node) {
if (!node) {
flag = true;
return;
}
dfs(node->left);
if (flag) {
++t;
if (t == k) {
ans = node;
return;
}
}
dfs(node->right);
}
TreeNode* KthNode(TreeNode* pRoot, int k)
{
this->k = k;
dfs(pRoot);
return this->ans;
}
};