这是我参与11月更文挑战的第22天,活动详情查看:2021最后一次更文挑战
二叉搜索树的第K大节点
给定一棵二叉搜索树,请找出其中第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 ≤ 二叉搜索树元素个数
题解
方法一:中序遍历——Java
中序遍历:
二叉搜索树中序遍历是从小到大。先遍历右子树,再遍历左子树,就变成从大到小了。
用target计数,target等于0时,就是我们要找的第K大节点
为求第 k 个节点,需要实现以下 三项工作 :
递归遍历时计数,统计当前节点的序号;
递归到第 k 个节点时,应记录结果 res ;
记录结果后,后续的遍历即失去意义,应提前终止(即返回)。
递归解析: 终止条件: 当节点 root 为空(越过叶节点),则直接返回;
递归右子树: 即 dfs(root.right) ;
三项工作:
提前返回: 若 k = 0 ,代表已找到目标节点,无需继续遍历,因此直接返回;
统计序号: 执行 k = k - 1 (即从 k 减至 0 );
记录结果: 若 k = 0 ,代表当前节点为第 k 大的节点,因此记录 res = root.val ;
递归左子树: 即 dfs(root.left);
class Solution {
private int kthLargestK = 0;
private int kthLargestRes = 0;
public int kthLargest(TreeNode root, int k) {
if (root == null || k <= 0) {
return -1;
}
this.kthLargestK = k;
kthLargestHelper(root);
return kthLargestRes;
}
public void kthLargestHelper(TreeNode root) {
if (root == null) {
return;
}
kthLargestHelper(root.right);
if (--kthLargestK == 0) {
kthLargestRes = root.val;
return;
}
kthLargestHelper(root.left);
}
}
时间复杂度:O(N)
空间复杂度:O(N)
方法一:中序遍历——Go
func kthLargest(root *TreeNode, k int)(res int ){
var recur func(root*TreeNode)
recur=func(root*TreeNode){
if root==nil||k<=0{
return
}
recur(root.Right)
k--
if k==0{
res=root.Val
return
}
recur(root.Left)
}
recur(root)
return
}