题目链接
牛客:二叉搜索树的第k个结点
LeetCode:剑指 Offer 54. 二叉搜索树的第k大节点
思路
牛客和LeetCode上这两道题目有所区别,牛客是求第 k 小个值,LeetCode是另求第 k 大个值。
第 k 小个值就是中序遍历,左->中->右,第 k 大个值相反,右->中->左。
代码
牛客:
public class Solution {
private int n;
private TreeNode res;
TreeNode KthNode(TreeNode pRoot, int k)
{
n = k;
dfs(pRoot);
return res;
}
void dfs(TreeNode node) {
if (node == null || n <= 0) {
return;
}
dfs(node.left);
if (--n == 0) {
res = node;
return;
}
dfs(node.right);
}
}
LeetCode:
class Solution {
private int res, n;
public int kthLargest(TreeNode root, int k) {
n = k;
dfs(root);
return res;
}
public void dfs(TreeNode node) {
if (node == null || n <= 0) {
return;
}
dfs(node.right);
if (--n == 0) {
res = node.val;
return;
}
dfs(node.left);
}
}
类似题目
二叉搜索树第K小的元素
230. 二叉搜索树中第K小的元素
class Solution {
public int kthSmallest(TreeNode root, int k) {
reverse(root, k);
return res;
}
int index = 1;
int res = 0;
public void reverse(TreeNode root, int k) {
if (root == null) {
return;
}
reverse(root.left, k);
if (index++ == k) {
res = root.val;
return;
}
reverse(root.right, k);
}
}