我是靠谱客的博主 玩命抽屉,最近开发中收集的这篇文章主要介绍LeetCode230. 二叉搜索树中第K小的元素,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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小的元素所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(39)

评论列表共有 0 条评论

立即
投稿
返回
顶部