一、题目描述
给定一棵二叉搜索树,请找出其中的第k小的结点。例如, (5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4。
二、解析
1.二叉搜索树:二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉搜索树。
2.知道什么是二叉搜索树,结合中序遍历,可以对数据从小到大排序,存入数组中,读取第k个即可。
3.也可以在实现中序遍历输出时,对k进行处理,当k为0时就是我们需要输出的节点。
三、代码实现
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};
*/
class Solution {
public:
TreeNode* KthNode(TreeNode* pRoot,unsigned int k)
{
if(!pRoot) return nullptr;
stack<TreeNode *> r;
TreeNode* p =pRoot;
while(!r.empty() || p != nullptr){//r是空或遍历到空节点
while(p){
r.push(p);
p = p->left;
}
TreeNode* node = r.top();
r.pop();
if((--k)==0) return node;
p = node->right;
}
return nullptr;
}
};