给定一棵二叉搜索树,请找出其中第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.左子树上,所有节点的值<根节点的值;
2.右子树上,所有节点的值>=根节点的值;
3.任意节点的左、右子树也分别为二叉查找树。
特点:中序遍历的结果是排序结果。
基本思路:
1.获取树中所有节点的值
2.对这些值进行排序
3.找到第k大的值
BST的特点改进:
1.中序遍历直接完成排序
2.获取第k大
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public int kthLargest(TreeNode root, int k) {
List<Integer> list =inorder(root,new ArrayList<>());
//第k大位于数组第list.size()-k的位置
return list.get(list.size()-k);
}
public List<Integer> inorder(TreeNode root,List<Integer> list){
if(root == null) return list;//边界条件
//递归开始,遍历递归左子树
inorder(root.left,list);
//处理根节点,加入list
list.add(root.val);
//递归右子树
inorder(root.right,list);
return list;
}
}