精选力扣500题 第62题 剑指 Offer 54. 二叉搜索树的第k大节点c++/java详细题解
Posted 林深时不见鹿
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了精选力扣500题 第62题 剑指 Offer 54. 二叉搜索树的第k大节点c++/java详细题解相关的知识,希望对你有一定的参考价值。
1、题目
给定一棵二叉搜索树,请找出其中第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
限制:
1 ≤ k ≤
二叉搜索树元素个数
2、思路
(dfs) O ( n ) O(n) O(n)
什么是二叉搜索树 ?
二叉搜索树是一棵有序的二叉树,所以我们也可以称它为二叉排序树。具有以下性质的二叉树我们称之为二叉搜索树:若它的左子树不为空,那么左子树上的所有值均小于它的根节点;若它的右子树不为空,那么右子树上所有值均大于它的根节点。它的左子树和右子树分别也为二叉搜索树。
二叉搜索树的中序遍历是:左=>根=>右; 二叉搜索树的中序遍历从小到大是有序的。
中序遍历模板
//打印中序遍历
void dfs(TreeNode* root )
{
if(!root) return;
dfs(root->left); //左
print(root->val); //根
dfs(root->right); //右
}
如图所示
因此求二叉搜索树第 k
大的节点” 可转化为求 “二叉搜索树的中序遍历倒序的第k
个节点”。
过程如下:
-
1、按照右->根->左的顺序(中序遍历倒序)遍历二叉树
-
2、我们每次遍历一个节点的时候就让
k--
,当k
减为0时,我们就找到了第k
大的节点。
具体实现细节看代码。
时间复杂度分析: 每个节点最多只会被遍历1
次,因此n
个节点,时间复杂度为
O
(
n
)
O(n)
O(n) 。
3、c++代码
/**
* 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 res;
int kthLargest(TreeNode* root, int k) {
dfs(root,k);
return res;
}
void dfs(TreeNode* root ,int &k) //传引用 这里需要保证所有dfs函数共用一个k
{
if(!root) return;
dfs(root->right,k); //右
k--;
if(!k) res = root->val; //根
dfs(root->left,k); //左
}
};
4、java代码
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
int res;
int index = 0; //计数器
public int kthLargest(TreeNode root, int k) {
dfs(root,k);
return res;
}
void dfs(TreeNode root ,int k)
{
if(root == null) return;
dfs(root.right,k); //右
index++;
if(k == index) res = root.val; //根
dfs(root.left,k); //左
}
}
原题链接: 剑指 Offer 54. 二叉搜索树的第k大节点
以上是关于精选力扣500题 第62题 剑指 Offer 54. 二叉搜索树的第k大节点c++/java详细题解的主要内容,如果未能解决你的问题,请参考以下文章
精选力扣500题 第63题 剑指 Offer 36. 二叉搜索树与双向链表c++/java详细题解
精选力扣500题 第25题 LeetCode 54. 螺旋矩阵c++ / java 详细题解
精选力扣500题 第54题 LeetCode 41. 缺失的第一个正数c++/java详细题解
精选力扣500题 第19题 LeetCode 199. 二叉树的右视图c++详细题解