题目描述
给定一颗二叉搜索树,请找出其中的第k大的结点。例如, 5 / \ 3 7 /\ /\ 2 4 6 8 中,按结点数值大小顺序第三个结点的值为4。
思路:
采用先序遍历,引入参数k和res,前者用来记录取到还剩几个数,后者用来保存最后的结点。
代码:
/*
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) return NULL;
TreeNode* res = NULL;
KthNodeCore(pRoot, k, res);
return res;
}
void KthNodeCore(TreeNode* p, int &k, TreeNode* &T) {
if(k > 0 && p->left != NULL) {
KthNodeCore(p->left, k, T);
}
if(k == 1) {
T = p;
}
--k;
if(k > 0 && p->right != NULL) {
KthNodeCore(p->right, k, T);
}
}
};