题目:
实现一个二叉搜索树迭代器。你将使用二叉搜索树的根节点初始化迭代器。
调用 next()
将返回二叉搜索树中的下一个最小的数。
注意: next()
和hasNext()
操作的时间复杂度是O(1),并使用 O(h) 内存,其中 h 是树的高度。
解题思路:
通过中序遍历返回下一个节点。
代码实现:
利用List的Iterator方法实现:
import java.lang.reflect.Array; import java.util.ArrayList; import java.util.Iterator; import java.util.List; /** * Definition for binary tree * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ public class BSTIterator { private Iterator<Integer> itr; private List<Integer> list; public BSTIterator(TreeNode root) { list = new ArrayList<Integer>(); inorder(root); itr = list.iterator(); } private void inorder(TreeNode root) { if (root == null) return; inorder(root.left); list.add(root.val); inorder(root.right); } /** @return whether we have a next smallest number */ public boolean hasNext() { return itr.hasNext(); } /** @return the next smallest number */ public int next() { return itr.next(); } private class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int x) { val = x; } } } /** * Your BSTIterator will be called like this: * BSTIterator i = new BSTIterator(root); * while (i.hasNext()) v[f()] = i.next(); */
利用栈实现:
/** * Definition for binary tree * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ public class BSTIterator { private TreeNode root; private Stack<TreeNode> stack; public BSTIterator(TreeNode root) { this.root = root; stack = new Stack<TreeNode>(); } /** @return whether we have a next smallest number */ public boolean hasNext() { while (root != null) { stack.push(root); root = root.left; } return !stack.isEmpty(); } /** @return the next smallest number */ public int next() { int val = 0; if (root == null && !stack.isEmpty()) { root = stack.pop(); val = root.val; root = root.right; } else { val = root.val; } return val; } } /** * Your BSTIterator will be called like this: * BSTIterator i = new BSTIterator(root); * while (i.hasNext()) v[f()] = i.next(); */