https://oj.leetcode.com/problems/binary-search-tree-iterator/
题目
给一二叉树root,实现一个中顺遍历的 Iterator,这个Iterator 具备两个函数。
boolen hasNext(), 返回树是否还有下一个inorder traversal 的节点。
TreeNode next(), 每次调用都返回下一个 inorder traversal 的节点。
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) {
val = x;
}
}
分析
#1 最简单的办法是中序遍历一遍二叉树放到List里。是需要O(N)的额外空间,坏处是初始化时间较长,好处是每次next的复杂度是O(1)
#2 把如下非递归中序遍历拆到hasNext与next里面。最坏需要O(N)额外空间,好处是初始化O(1),坏处是最差的next复杂度是O(N)。空间是O(H)。
public class Solution {
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> result = new ArrayList<Integer>();
Stack<TreeNode> stack = new Stack<TreeNode>();
TreeNode cur = root;
//开始的时候stack为空但是cur指向root
while(cur != null || !stack.empty()){
//往左到底
while(cur != null) {
stack.push(cur);
cur = cur.left;
}
//cur为空,pop
cur = stack.pop();
result.add(cur.val);
//转向右
cur = cur.right;
}//first while
return result;
}
}
实现
public class Solution{
private TreeNode cur;
private Stack<TreeNode> stack = new Stack<TreeNode>();
public Solution(TreeNode root) {
cur = root;
}
public boolean hasNext() {
return (cur != null || !stack.empty());
}
public TreeNode next() {
while(cur != null) {
stack.push(cur);
cur = cur.left;
}
TreeNode result = stack.pop();
cur = result.right;
return result;
}
}