0
点赞
收藏
分享

微信扫一扫

剑指 Offer 54. 二叉搜索树的第k大节点【c++/java详细题解】


目录

  • ​​1、题目​​
  • ​​2、思路​​
  • ​​3、c++代码​​
  • ​​4、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) 剑指 Offer 54. 二叉搜索树的第k大节点【c++/java详细题解】_数据结构

什么是二叉搜索树 ?

二叉搜索树是一棵有序的二叉树,所以我们也可以称它为二叉排序树。具有以下性质的二叉树我们称之为二叉搜索树:若它的左子树不为空,那么左子树上的所有值均小于它的根节点;若它的右子树不为空,那么右子树上所有值均大于它的根节点。它的左子树和右子树分别也为二叉搜索树。

二叉搜索树的中序遍历是:左=>根=>右; 二叉搜索树的中序遍历从小到大是有序的。

中序遍历模板

//打印中序遍历
void dfs(TreeNode* root )
{
if(!root) return;
dfs(root->left); //左
print(root->val); //根
dfs(root->right); //右
}

如图所示

剑指 Offer 54. 二叉搜索树的第k大节点【c++/java详细题解】_力扣_02

因此求二叉搜索树第 ​​k​​​大的节点” 可转化为求 “二叉搜索树的中序遍历倒序的第​​k​​ 个节点”。

过程如下:

  • 1、按照右->根->左的顺序(中序遍历倒序)遍历二叉树
  • 2、我们每次遍历一个节点的时候就让​​k--​​,当​​k​​减为0时,我们就找到了第​​k​​大的节点。

具体实现细节看代码。

时间复杂度分析: 每个节点最多只会被遍历​​1​​​次,因此​​n​​​个节点,时间复杂度为剑指 Offer 54. 二叉搜索树的第k大节点【c++/java详细题解】_数据结构

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大节点​​​剑指 Offer 54. 二叉搜索树的第k大节点【c++/java详细题解】_二叉树_04


举报

相关推荐

0 条评论