题目描述
给定一棵二叉搜索树,请找出其中的第k小的结点。例如, (5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4。
题目分析
二叉搜索树的性质是:左子树<根结点<右子树
采用递归的方式,不断递归深入根节点的左孩子,直到碰到空节点为止,然后回溯输出当前节点。再以同样的方式递归遍历其右孩子。在此期间,每访问一个节点,我们都对k进行减一操作,直到k为0,说明该节点即为第k个节点。
详情请见注释。
代码
C++代码如下:
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};
*/
class Solution {
public:
int m;
TreeNode* t;
void dfs(TreeNode* p)
{
if(!p||m<1) return;//递归出口
dfs(p->left);//最左边结点,走到左下后,一层层回溯
if(m==1)t=p;//当m为1时,就是当前第k小结点
if(--m>0)
dfs(p->right);;//遍历顺序左中右
}
TreeNode* KthNode(TreeNode* pRoot, int k)
{
m=k;
t=NULL;
dfs(pRoot);
return t;
}
};