2019.7.31 #程序员笔试必备# LeetCode 从零单刷个人笔记整理(持续更新)
这道题主要是考察中序遍历,可以用递归和循环的方式去实现(非递归的方式需要借助显式的栈进行辅助存储)。
如果搜索树需要频繁搜索第k小的值,可以提前将中序遍历的序列保存在一个数组中。
Given a binary search tree, write a function kthSmallest to find the kth smallest element in it.
Note: You may assume k is always valid, 1 ≤ k ≤ BST’s total elements.
给定一个二叉搜索树,编写一个函数 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 函数?
import java.util.Stack;
/**
*
* Given a binary search tree, write a function kthSmallest to find the kth smallest element in it.
* Note: You may assume k is always valid, 1 ≤ k ≤ BST's total elements.
* 给定一个二叉搜索树,编写一个函数 kthSmallest 来查找其中第 k 个最小的元素。
* 说明:你可以假设 k 总是有效的,1 ≤ k ≤ 二叉搜索树元素个数。
*
*/
public class KthSmallestElementInABST {
public class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) {
val = x;
}
}
//递归中序遍历
public int num;
public TreeNode result;
public int kthSmallest(TreeNode root, int k) {
num = 0;
result = null;
Solution(root, k);
return result.val;
}
public void Solution(TreeNode root, int k){
if(num == k || root == null)
return;
Solution(root.left, k);
if(num == k)
return;
result = root;
++num;
Solution(root.right, k);
}
//循环中序遍历
public int kthSmallest1(TreeNode root, int k) {
Stack<TreeNode> stack = new Stack<>();
TreeNode curNode = root;
int num = 0;
while(curNode != null || !stack.empty()){
if(curNode != null){
stack.push(curNode);
curNode = curNode.left;
}else{
curNode = stack.pop();
if(++num == k)
return curNode.val;
curNode = curNode.right;
}
}
return -1;
}
}
#Coding一小时,Copying一秒钟。留个言点个赞呗,谢谢你#