给定一个二叉搜索树的根节点 root
,和一个整数 k
,请你设计一个算法查找其中第 k
小的元素(从 1 开始计数)。
示例 1:
输入:root = [3,1,4,null,2], k = 1 输出:1
示例 2:
输入:root = [5,3,6,2,4,null,null,1], k = 3 输出:3
提示:
-
树中的节点数为
n
。 -
1 <= k <= n <= 104
-
0 <= Node.val <= 104
进阶:如果二叉搜索树经常被修改(插入/删除操作)并且你需要频繁地查找第 k
小的值,你将如何优化算法?
思路:
由于二叉树本身就是有序存储的,故使用前序遍历二叉树,将结果储存在列表中,列表中的所用序列都是有序的,只需要在这里面找出第K个元素即可。
public class test {//IDEA测试代码
public static void main(String[] args) {
TreeNode treeNode2 = new TreeNode(2);
TreeNode treeNode1 = new TreeNode(1,null,treeNode2);
TreeNode treeNode4 = new TreeNode(4);
TreeNode treeNode = new TreeNode(3,treeNode1,treeNode4);
test a = new test();//静态方法调用非静态方法要创建对象
a.kthSmallest(treeNode,1);
}
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;
}
}
ArrayList<Integer> integers = new ArrayList<>();
public int kthSmallest(TreeNode root, int k) {//leetcode提交代码
listNum(root); //前序遍历树,并将二叉树所有的节点储存在列表之中
//System.out.println(integers.get(k-1));
return integers.get(k-1); //由于列表中的数据是有序的,所以可以直接输出
}
public void listNum(TreeNode root){//前序遍历
if(root == null){
return;
}
listNum(root.left);
integers.add(root.val);
listNum(root.right);
}
}