思路一:
二叉搜索树是中序遍历由小到大排列的,根据这个特性可以找到中序排列的序列来解,顺便复习了中序遍历的非递归算法
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class BSTIterator {
Queue<Integer>list = new LinkedList<Integer>();
Stack<TreeNode>stk = new Stack<TreeNode>();
public BSTIterator(TreeNode root) {
if(root!=null){
while(!stk.isEmpty()||root!=null){
while(root!=null){
stk.push(root);
root = root.left;
}
list.offer(stk.peek().val);
root = stk.pop().right;
}
}
System.out.println(list.size());
}
/** @return the next smallest number */
public int next() {
return list.poll();
}
/** @return whether we have a next smallest number */
public boolean hasNext() {
if(list.size()>0){
return true;
}else{
return false;
}
}
}
/**
* Your BSTIterator object will be instantiated and called as such:
* BSTIterator obj = new BSTIterator(root);
* int param_1 = obj.next();
* boolean param_2 = obj.hasNext();
*/
思路二:
将左子树一直入栈,则栈中从大到小排列,出栈时将左子树出栈的同时将右子树入栈,非递归中序遍历的思路
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class BSTIterator {
Stack<TreeNode>stk = new Stack<TreeNode>();
public BSTIterator(TreeNode root) {
while(root!=null){
stk.push(root);
root = root.left;
}
}
/** @return the next smallest number */
public int next() {
int a = stk.peek().val;
TreeNode tree = stk.pop().right;
while(tree!=null){
stk.push(tree);
tree=tree.left;
}
return a;
}
/** @return whether we have a next smallest number */
public boolean hasNext() {
if(!stk.isEmpty()){
return true;
}else{
return false;
}
}
}
/**
* Your BSTIterator object will be instantiated and called as such:
* BSTIterator obj = new BSTIterator(root);
* int param_1 = obj.next();
* boolean param_2 = obj.hasNext();
*/