文章目录
题目描述
给定一棵二叉搜索树,请找出其中第k大的节点。
示例 1:
输入: root = [3,1,4,null,2], k = 1
3
/ \
1 4
\
2
输出: 4
示例 2:
输入: root = [5,3,6,2,4,null,null,1], k = 3
5
/ \
3 6
/ \
2 4
/
1
输出: 4
题解思路
方法一:递归
一般情况的中序反向遍历,时间复杂度为O(n)。但是有一个问题,就是当找到了第k大的数后,还会继续遍历整棵树,做无用功。
代码实现:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
int kthLargest(TreeNode* root, int k) {
int res = 0;
dfs(root, res, k);
return res;
}
private:
void dfs(TreeNode* root, int& res, int& k){
if(root == nullptr) return;
dfs(root->right, res, k);
if(k == 1) res = root->val;
dfs(root->left, res, --k);
}
};
方法二:非递归
非递归方式。就需要我们自己手动维护一个调用栈。
代码实现:
class Solution {
public:
int kthLargest(TreeNode* root, int &k) {
stack<TreeNode*> st;
while(root || st.size()){
while(root){
st.push(root); // 根入栈
root = root->right; // 访问右子树,向下探
}
root = st.top(), st.pop(); // 出栈
if(!--k) return root->val;
root = root->left; // 访问左子树
}
return 0;
}
};
如有帮助到您,可以多多点赞、评论鼓励哟~~~