题目描述
给定一棵二叉搜索树,请找出其中的第k小的结点。例如, (5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4。
解析:首先,要求按照节点数值的大小顺序的第几小的几点值进行查找
因此是有序的,这刚好是中序遍历的特点
我的想法就是中序遍历二叉树,同时设置一个变量值,每遍历过一个节点,节点+1
如果变量值等于k 那么跳出循环输出当前节点即可
非递归的处理方法更容易想一点:
class Solution {
public:
TreeNode * KthNode(TreeNode* pRoot, int k)
{
if (pRoot == nullptr || k < 0)
return nullptr;
TreeNode* node = pRoot;
int count = 0;
stack<TreeNode*> s;
while (!s.empty() || node != nullptr)
{
while (node != nullptr)
{
s.push(node);
node = node->left;
}
if (!s.empty())
{
node = s.top();
s.pop();
count++;
if (count == k)
break;
node = node->right;
}
}
return node;
}
};
大佬们的递归版本:
class Solution {
public:
int count = 0;
TreeNode * KthNode(TreeNode* pRoot, int k)
{
if (pRoot != nullptr)
{
TreeNode* node = KthNode(pRoot->left, k);
if (node != nullptr)
return node;
count++;
if (count == k)
return pRoot;
node = KthNode(pRoot->right, k);
if (node != nullptr)
return node;
}
return nullptr;
}
};