题目描述:
给定一个二叉搜索树,编写一个函数 kthSmallest 来查找其中第 k 个最小的元素。
说明:
你可以假设 k 总是有效的,1 ≤ k ≤ 二叉搜索树元素个数。
使用中序遍历取第k-1个即可
代码:
public int kthSmallest(TreeNode root, int k) {
List<Integer> tem = new ArrayList<>();
gettem(root, tem);
return tem.get(k - 1);
}
public void gettem(TreeNode node,List<Integer> list){
if(node == null){
return ;
}
gettem(node.left, list);
list.add(node.val);
gettem(node.right, list);
}
当然我们不需要遍历整个二叉搜索树,只需要一部分即可,我们计算左子树和右子树的数目与m的关系
进行递归遍历
class Solution {
public int kthSmallest(TreeNode root, int k) {
int leftSum = sumTree(root.left);
if (leftSum+1 == k){
return root.val;
}else if (leftSum+1 > k){
return kthSmallest(root.left,k);
} else if (leftSum+1 < k){
return kthSmallest(root.right,k-leftSum-1);
}
return root.val;
}
public int sumTree(TreeNode root){
if ( root == null){
return 0;
}
return 1+sumTree(root.left)+sumTree(root.right);
}
}