输入: root = [3,1,4,null,2], k = 1
3
/ \
1 4
\
2
输出: 4
输入: root = [5,3,6,2,4,null,null,1], k = 3
5
/ \
3 6
/ \
2 4
/
1
输出: 4
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
int ans, K;
public int kthLargest(TreeNode root, int k) {
// K作为全局变量使用
K = k;
// 对二叉搜索树进行中序遍历
dfs(root);
// 返回结果
return ans;
}
// 求 “二叉搜索树第 k 大的节点” 可转化为求 “此树的中序遍历倒序的第 k 个节点”。
// 中序遍历倒序的遍历:右根左
public void dfs(TreeNode root) {
if (root == null)
return;
// 右
dfs(root.right);
// 找到了第k大的元素,记录下来,返回即可
if (--K == 0) {
ans = root.val;
return;
}
// 左
dfs(root.left);
}
}
/**
* Example:
* var ti = TreeNode(5)
* var v = ti.`val`
* Definition for a binary tree node.
* class TreeNode(var `val`: Int) {
* var left: TreeNode? = null
* var right: TreeNode? = null
* }
*/
class Solution {
var ans: Int = 0
var kk: Int = 0
fun kthLargest(root: TreeNode, k: Int): Int {
// kk作为全局变量使用
kk = k
// 对二叉搜索树进行中序遍历
dfs(root)
// 返回结果
return ans
}
// 求 “二叉搜索树第 k 大的节点” 可转化为求 “此树的中序遍历倒序的第 k 个节点”。
// 中序遍历倒序的遍历:右根左
fun dfs(root: TreeNode?) {
if (root == null)
return
// 右
dfs(root.right)
// 找到了第k大的元素,记录下来
if (--kk == 0)
ans = root.`val`
// kk已经找到了,返回即可
if (kk == 0)
return
// 左
dfs(root.left)
}
}