230. Kth Smallest Element in a BST

来源:互联网 发布:前端 后端 数据库 编辑:程序博客网 时间:2024/06/05 11:11

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.

Follow up:
What if the BST is modified (insert/delete operations) often and you need to find the kth smallest frequently? How would you optimize the kthSmallest routine?

Credits:
Special thanks to @ts for adding this problem and creating all test cases.

根据BST的性质,一路向左下找到最小的,同时一路push,到底了pop一个得到1th small,有右节点的话push进去,再次一路push,找到2th small,依此类推。代码如下:

/** * Definition for a binary tree node. * public class TreeNode { *     int val; *     TreeNode left; *     TreeNode right; *     TreeNode(int x) { val = x; } * } */public class Solution {    public int kthSmallest(TreeNode root, int k) {        Stack<TreeNode> stack = new Stack<TreeNode>();        HashSet<TreeNode> hs = new HashSet<TreeNode>();        TreeNode resNode = null;        stack.push(root);        while (k > 0) {            while (stack.peek().left != null && !hs.contains(stack.peek().left)) {                stack.push(stack.peek().left);            }            k --;            resNode = stack.pop();            hs.add(resNode);            if (resNode.right != null) {                stack.push(resNode.right);            }        }        return resNode.val;    }}
第二种是DFS递归的方法。代码如下:

public int kthSmallest(TreeNode root, int k) {        int count = countNodes(root.left);        if (k <= count) {            return kthSmallest(root.left, k);        } else if (k > count + 1) {            return kthSmallest(root.right, k-1-count); // 1 is counted as current node        }                return root.val;    }        public int countNodes(TreeNode n) {        if (n == null) return 0;                return 1 + countNodes(n.left) + countNodes(n.right);    }
第三种方法,中序遍历。代码如下:

// better keep these two variables in a wrapper class    private static int number = 0;    private static int count = 0;    public int kthSmallest(TreeNode root, int k) {        count = k;        helper(root);        return number;    }        public void helper(TreeNode n) {        if (n.left != null) helper(n.left);        count--;        if (count == 0) {            number = n.val;            return;        }        if (n.right != null) helper(n.right);    }

0 0