概述
1. 问题
给定一个二叉搜索树,编写一个函数 kthSmallest 来查找其中第 k 个最小的元素。
示例 1:
输入: root = [3,1,4,null,2], k = 1
3
/
1 4
2
输出: 1
原题链接;
2. 解法
方法一:先遍历二叉搜索树,再返回第 k 个最小元素。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public int kthSmallest(TreeNode root, int k) {
if(root == null) return 0;
List<Integer> nodeNum = new LinkedList<>();
traversing(root, nodeNum);
System.out.println(nodeNum);
return nodeNum.get(k-1);
}
public void traversing(TreeNode root, List<Integer> nodeNum){
if(root.left != null){
traversing(root.left, nodeNum);
}
nodeNum.add(root.val);
if(root.right!= null){
traversing(root.right, nodeNum);
}
}
}
O(n)时间复杂度;
更快的:提前终止。
class Solution {
private int i = 0;
private int val = 0;
public int kthSmallest(TreeNode root, int k) {
ldr(root, k);
return val;
}
public void ldr(TreeNode root, int k) {
if (root == null) {
return;
}
ldr(root.left, k);
if (k == ++i) {
val = root.val;
}
ldr(root.right, k);
}
}
方法二:递归
class Solution {
/**
* 查找左子树节点个数为leftN,如果K<=leftN,则所查找节点在左子树上.
* 若K=leftN+1,则所查找节点为根节点
* 若K>leftN+1,则所查找节点在右子树上,按照同样方法查找右子树第K-leftN个节点
* @param root
* @param k
* @return
*/
public int kthSmallest(TreeNode root, int k) {
int leftN=findChild(root.left);
if(leftN+1==k) return root.val;
else if(k<=leftN){
return kthSmallest(root.left, k);
}
else return kthSmallest(root.right, k-leftN-1);
}
/**
*查找子节点个数
* @param root
* @return
*/
public int findChild(TreeNode root){
if(root==null) return 0;
return findChild(root.left)+findChild(root.right)+1;
}
}
// https://leetcode-cn.com/problems/kth-smallest-element-in-a-bst/comments/;
最后
以上就是玩命抽屉为你收集整理的LeetCode230. 二叉搜索树中第K小的元素的全部内容,希望文章能够帮你解决LeetCode230. 二叉搜索树中第K小的元素所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复