题目描述:给定一颗二叉搜索树,请找出其中的第k大的结点。
例子:
思路:方法其实很容易想到,用到中序遍历的思想,但是代码在递归实现的过程中还是比较巧妙的。
代码:
/*
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, int k)
{
if(pRoot==NULL || k==0)
return NULL;
return KthNodeCore(pRoot,k);
}
TreeNode* KthNodeCore(TreeNode* pRoot, int &k){
TreeNode* target = NULL;
if(pRoot->left!=NULL)//左,一直找到最左边的节点
target = KthNodeCore(pRoot->left,k);
if(target==NULL){//中
if(k==1)//递归终止条件
target = pRoot;
k--;
}
if(target==NULL && pRoot->right!=NULL)//右
target = KthNodeCore(pRoot->right,k);
return target;
}
};
程序分析:以上图的例子为例, if(target==NULL)这一判断条件在这个例子中一共进了3次,分别如下图: