题目描述
给定一棵二叉搜索树,请找出其中第k大的节点。
解题思路
二叉搜索树的特点是中序遍历之后是一个排序的数组
这又是一类经典的题目:首先我们要申明一个变量记录节点在树的位置,在中序遍历的位置将这个值加1,然后与K值进行比较。
这道题目和LeetCode上的230二叉搜索树中的第K小个数相比,不同点一个是求大、 一个是求小。我刚开始也想了一会怎么处理第K大个数呢,突然想到竟然中序遍历是排序好的数组,那么按照右根左的顺序不就是逆序数组了。
AC 代码
LC230. 二叉搜索树中第K小的元素
class Solution {
int res=0;
int rank=0;
public int kthSmallest(TreeNode root, int k) {
dfs(root,k);
return res;
}
private void dfs(TreeNode node,int k){
if(node==null){
return;
}
dfs(node.left,k);
rank++;
if(rank==k){
res=node.val;
return;
}
dfs(node.right,k);
}
}
JZ剑指 Offer 54. 二叉搜索树的第k大节点
class Solution {
int num=0;
int rank=0;
public int kthLargest(TreeNode root, int k) {
//中序进行遍历
dfs(root,k);
return num;
}
private void dfs(TreeNode node,int k){
if(node==null){
return;
}
dfs(node.right,k);
rank++;
if(k==rank){
num=node.val;
return;
}
dfs(node.left,k);
}
}
总结
二叉搜索树是一类经典题目,必须掌握框架