题目
分析
做每一个题目,都要仔细的分析题目,这是我总结出来的很重要的一个技巧
题目中的每一句话,可能都是解题的线索
本题有两个要素,二叉搜索树,第K大
一看到二叉搜索树,就应该想到,这个树按照中序遍历是从小到大的,这样思路就有了,只要按照中序遍历到第k个数字,那么就求出来了啊,开始写代码
代码
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
//用一个数组存遍历出来的数字
private List<Integer> sortedArray = new ArrayList<>();
public int kthSmallest(TreeNode root, int k) {
//中序遍历
traverse(root,k);
return sortedArray.get(k-1);
}
public void traverse(TreeNode root, int k) {
//到空节点就结束
if(root == null) {
return;
}
//先左节点
traverse(root.left,k);
//中序遍历,读取数值在中间
sortedArray.add(root.val);
//如果个数到了就停止
if(sortedArray.size()>k) {
return;
}
//遍历右节点
traverse(root.right,k);
}
}
总体就是实现中序遍历,题目二叉搜索树的目的就是引导你做中序遍历,他不可能直接告诉你做中序遍历的,通过各种拐弯抹角告诉你:实现中序遍历
结果
优化
好像空间复杂度有点高,想了一下,我使用一个数组存了遍历出来的k个数字,其实除了第k个都不需要存,所以优化一下
代码
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
private int knum;
private int n = 0;
public int kthSmallest(TreeNode root, int k) {
traverse(root,k);
return knum;
}
public void traverse(TreeNode root, int k) {
if(root == null) {
return;
}
traverse(root.left,k);
//使用n存储遍历到第几个了,如果到了第k个
n++;
if(n == k) {
//就记录下第k个,返回
knum = root.val;
return;
}
traverse(root.right,k);
}
}