leetcode刷题12

今天刷的题是LeetCode230题,该题是给定一个二叉搜索树,要求查找其中第k个最小的元素,并且你可以假定k总是有效的

我这里采用的是暴力解法,具体的思路是层级遍历,将二叉树的值放入到一个list中,然后排序。当然排序可以用collections.sort,但是我这里是自己写的快排。具体的代码如下:

import LeetcodePart6.TreeNode;

import java.util.*;

public class kthSmallest_230_middle {
    private static List<Integer> result;
    public static int solution1(TreeNode root,int k){
        //暴力法求解:先把所有的节点的值都遍历出来,放在一个数组中,然后在排序
        int i=1;
        List<Integer> number=new ArrayList<>();
        Queue<TreeNode> list=new LinkedList<>();
        list.add(root);
        while (i!=0){
            TreeNode node=list.poll();
            number.add(node.val);
            if (node.right!=null)list.add(node.right);
            if (node.left!=null)list.add(node.left);
            i--;
            if (i==0){
                i=list.size();
            }
        }
        //排序,使用快排
        quickSort(number,0,number.size()-1);
        return number.get(k-1);
    }
    public static List<Integer> quickSort(List<Integer> num,int start,int end){
        if (start>=end) return num;
        int q=partition(num,start,end);
        quickSort(num,start,q-1);
        quickSort(num,q+1,end);
        return num;
    }
    public static int partition(List<Integer> num,int start,int end){
        int pivot=num.get(end);
        int i=start;
        for (int j = start; j <=end-1 ; j++) {
            if (num.get(j)<pivot){
                int temp=num.get(i);
                num.set(i,num.get(j));
                num.set(j,temp);
                i++;
            }
        }
        int temp=num.get(i);
        num.set(i,num.get(end));
        num.set(end,temp);
        return i;
    }
}

  

posted @ 2019-08-19 19:35  刘云生  阅读(158)  评论(0编辑  收藏  举报