
一、前言
本系列文章为《剑指Offer》刷题笔记。
刷题平台:牛客网
书籍下载:共享资源
二、题目
给定一颗二叉搜索树,请找出其中的第k大的结点。例如,在下图中,按结点数值大小顺序第三个结点的值为4。
这棵树是二叉搜索树,首先想到的是二叉搜索树的一个特点:左子结点的值 < 根结点的值 < 右子结点的值。
1、思路
如上图所示,如果使用终须遍历,则得到的序列式为{2,3,4,5,6,7,8}。因此,只需要用中序遍历一棵二叉搜索树,就很容易找出它的第k大结点。
2、代码
C++:
/*
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);
}
private:
TreeNode* KthNodeCore(TreeNode* pRoot, int &k){
TreeNode* target = NULL;
// 先遍历左结点
if(pRoot->left != NULL){
target = KthNodeCore(pRoot->left, k);
}
// 如果没有找到target,则继续减小k,如果k等于1,说明到了第k大的数
if(target == NULL){
if(k == 1){
target = pRoot;
}
k--;
}
// 如果没有找到target,继续找右结点
if(pRoot->right != NULL && target == NULL){
target = KthNodeCore(pRoot->right, k);
}
return target;
}
};
来源:
https://cuijiahua.com/blog/2018/01/basis_62.html

