网站救助计划
1.为阅读体验,本站无任何广告,也无任何盈利方法,站长一直在用爱发电,现濒临倒闭,希望有能力的同学能帮忙分担服务器成本
2.捐助10元及以上同学,可添加站长微信lurenzhang888,备注捐助,网站倒闭后可联系站长领取本站pdf内容
3.若网站能存活下来,后续将会持续更新内容
题目描述
给定一棵二叉搜索树,请找出其中第 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 ≤ 二叉搜索树元素个数
题解
(二叉搜索树) O(k)
由于二叉搜索树的中序遍历是有序的,且是从小到大的,题目要求第 k 大的值,那么可以反过来按照「右中左」的顺序遍历二叉搜索树,那么遍历到第 k 个节点就是答案。
时间复杂度
最坏情况下的时间复杂度为 O(n)。
空间复杂度
O(1)
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 = 0;
void dfs(TreeNode* root, int& k) {
if (!k) return;
if (!root) return;
dfs(root->right, k);
k -- ;
if (!k) {
res = root->val;
return;
}
dfs(root->left, k);
}
int kthLargest(TreeNode* root, int k) {
if (!root) return 0;
dfs(root, k);
return res;
}
};
Java 代码
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
private int res = 0;
private void dfs(TreeNode root, int[] k) {
if (k[0] == 0) return;
if (root == null) return;
dfs(root.right, k);
k[0] -- ;
if (k[0] == 0) {
res = root.val;
return;
}
dfs(root.left, k);
}
public int kthLargest(TreeNode root, int k) {
if (root == null) return 0;
int[] count = { k };
dfs(root, count);
return res;
}
}
Python 代码
"""
Definition for a binary tree node.
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
"""
class Solution:
def kthLargest(self, root: TreeNode, k: int) -> int:
self.res = 0
def dfs(node, k):
if k[0] == 0:
return
if not node:
return
dfs(node.right, k)
k[0] -= 1
if k[0] == 0:
self.res = node.val
return
dfs(node.left, k)
k_count = [k]
dfs(root, k_count)
return self.res
本文由读者提供,Github地址:https://github.com/tonngw
点击面试手册,获取本站面试手册PDF完整版