二叉搜索树中第K小的元素(kth-smallest-element-in-a-bst)
给定一个二叉搜索树,编写一个函数 kthSmallest
来查找其中第 k 个最小的元素。
说明:
你可以假设 k 总是有效的,1 ≤ k ≤ 二叉搜索树元素个数。
示例 1:
输入: root = [3,1,4,null,2], k = 1
3
/ \
1 4
\
2
输出: 1
示例 2:
输入: root = [5,3,6,2,4,null,null,1], k = 3
5
/ \
3 6
/ \
2 4
/
1
输出: 3
进阶:
如果二叉搜索树经常被修改(插入/删除操作)并且你需要频繁地查找第 k 小的值,你将如何优化 kthSmallest
函数?
代码与思路
方法一,DFS的非递归形式
先用,DFS的非递归形式,把二叉搜索树转为List集合,排序,返回。
public class Solution {
// 先用,DFS的非递归形式,把二叉搜索树转为List集合,排序,返回。
public int kthSmallest(TreeNode root, int k) {
// DFS的非递归形式
List<TreeNode> res = new ArrayList<TreeNode>();
Stack<TreeNode> stack = new Stack<>();
stack.add(root);
while (!stack.empty()) {
TreeNode node = stack.peek();
res.add(node);
stack.pop();
if (node.right != null) {
stack.push(node.right);
}
if (node.left != null) {
stack.push(node.left);
}
}
// 排序
res.sort(new Comparator<TreeNode>() {
@Override
public int compare(TreeNode o1, TreeNode o2) {
return (o1.val < o2.val ? -1 : (o1.val == o2.val ? 0 : 1));
}
});
return res.get(k - 1).val;
}
public static void main(String[] args) {
TreeNode level_011 = new TreeNode(3);
TreeNode level_021 = new TreeNode(1);
TreeNode level_022 = new TreeNode(4);
TreeNode level_031 = new TreeNode(2);
level_011.left = level_021;
level_011.right = level_022;
level_021.right = level_031;
System.out.println(new Solution().kthSmallest(level_011, 1));
}
}
二叉搜索树
二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。
方法二,中序遍历
通过构造 BST 的中序遍历序列,则第 k-1
个元素就是第 k
小的元素。
public int kthSmallest(TreeNode root, int k) {
ArrayList<Integer> nums = inorder(root, new ArrayList<Integer>());
return nums.get(k - 1);
}
public ArrayList<Integer> inorder(TreeNode root, ArrayList<Integer> arr) {
if (root == null) return arr;
inorder(root.left, arr);
arr.add(root.val);
inorder(root.right, arr);
return arr;
}
中序遍历
结果:【GDHBAEICF】