230. 二叉搜索树中第K小的元素(kth-smallest-element-in-a-bst)

二叉搜索树中第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】
中序遍历顺序图片

参考资料

二叉树中序遍历
二叉搜索树中第K小的元素

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值