一、前言
本系列文章为《剑指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