二叉搜索树中第K小的元素
- leetcode 230 题 二叉搜索树第K 小的元素
- 解题思路
- 代码演示
- 二叉树专题
leetcode 230 题 二叉搜索树第K 小的元素
原题链接:
https://leetcode.cn/problems/kth-smallest-element-in-a-bst/
题目描述
给定一个二叉搜索树的根节点 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 小的元素了
代码演示
/**
* 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 {
//保存中序遍历结果 升序 集合
List<Integer> ans = new ArrayList();
public int kthSmallest(TreeNode root, int k) {
process(root);
//要求从1 开始算,所以 转换成下标 要减 1
return ans.get(k - 1);
}
//中序遍历
public void process(TreeNode root){
if(root == null){
return;
}
process(root.left);
ans.add(root.val);
process(root.right);
}
}
二叉树专题
从二叉搜索树到更大和树(java)
根据前序和后序遍历构造二叉树
二叉树展开为链表
镜像二叉树和求二叉树最大深度
二叉树的直径
填充每个节点的下一个右侧节点指针