Kth Smallest Element in a BST

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?


这个题求二叉搜索树第k小个节点。比较懒,直接用Binary Search Tree Iterator来写得了、

还可以用搜索二叉树的性质,中序遍历得到的第k个数就是第k小的节点。

代码如下:

public class Solution {
    class BSTIterator {

	    Stack<TreeNode> stack;
		Set<TreeNode> visited;
		
		public BSTIterator(TreeNode root) {
			stack=new Stack<TreeNode>();
			visited=new HashSet<TreeNode>();
			stack.add(root);
	    }

	    public boolean hasNext() {
			if(!stack.isEmpty()){
				return stack.peek()==null?false:true;
			}
	    	return false;
	    }

	    public int next() {
	    	TreeNode node=stack.peek();
	        while(node.left!=null&&!visited.contains(node.left)){
	    		stack.add(node.left);
	    		node=node.left;
	        }
	        node=stack.pop();
	        if(node.right!=null&&!visited.contains(node.right))
	        	stack.add(node.right);
	        visited.add(node);
	        return node.val;
	    }
	}
	
	public int kthSmallest(TreeNode root,int k){
		BSTIterator it=new BSTIterator(root);
		int i=0;
		while(it.hasNext()){
			int val=it.next();
			i++;
			if(k==i)
				return val;
		}
		return 0;
    }
}


你可能感兴趣的:(java,LeetCode,二叉树,tree)