给定一棵二叉搜索树,请找出其中第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
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/er-cha-sou-suo-shu-de-di-kda-jie-dian-lcof
我的思路:第k大的结点和第k个结点比较类似,所以想到的是中序遍历二查搜索树,但是在这里要求的是第k大的结点,就需要先得到这棵树的全部节点数,所以先用递归遍历所有结点,得到节点数总数sum,而在中序遍历中,第sum-k+1个就是第k个最大的数。
class Solution {
public int ret;
public int count;
public int kthLargest(TreeNode root, int k) {
int s=count(root);
inOrder(root,k,s);
return ret;
}
public int count(TreeNode root){
int sum=0;
if(root==null){
return sum=0;
}
else
sum=count(root.left)+count(root.right)+1;
return sum;
}
public void inOrder(TreeNode root,int k,int s){
if(root==null||count>s-k){
return;
}
inOrder(root.left,k,s);
count++;
if(count==s-k+1)
ret=root.val;
inOrder(root.right,k,s);
}
}
方法而:二查搜索树中序遍历是递增序列,那么中序遍历的倒序就是递减序列,又还原成找二查搜索树第k个结点的题目了!妙啊!
class Solution {
public int ret;
public int count;
public int kthLargest(TreeNode root, int k) {
inOrder(root,k);
return ret;
}
public void inOrder(TreeNode root,int k){
if(root==null||count>k){
return;
}
inOrder(root.right,k);
count++;
if(count==k)
ret=root.val;
inOrder(root.left,k);
}
}