【树】173. 二叉搜索树迭代器
题目:
实现一个二叉搜索树迭代器。你将使用二叉搜索树的根节点初始化迭代器。
调用 next() 将返回二叉搜索树中的下一个最小的数。
示例:
BSTIterator iterator = new BSTIterator(root);
iterator.next(); // 返回 3
iterator.next(); // 返回 7
iterator.hasNext(); // 返回 true
iterator.next(); // 返回 9
iterator.hasNext(); // 返回 true
iterator.next(); // 返回 15
iterator.hasNext(); // 返回 true
iterator.next(); // 返回 20
iterator.hasNext(); // 返回 false
解答:
方法一:中序遍历
/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ class BSTIterator { List<Integer> list; int index; public BSTIterator(TreeNode root) { this.list = new ArrayList<>(); this.index = 0; inOrder(root); } public void inOrder(TreeNode root){ if(root == null) return; inOrder(root.left); list.add(root.val); inOrder(root.right); } /** @return the next smallest number */ public int next() { int res = list.get(index); index++; return res; } /** @return whether we have a next smallest number */ public boolean hasNext() { return(index<list.size()); } } /** * 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(); */
方法二:受控递归(leetcode标答)
算法:

/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ class BSTIterator { Stack<TreeNode> stack; public BSTIterator(TreeNode root) { // Stack for the recursion simulation this.stack = new Stack<TreeNode>(); // Remember that the algorithm starts with a call to the helper function // with the root node as the input this._leftmostInorder(root); } private void _leftmostInorder(TreeNode root) { // For a given node, add all the elements in the leftmost branch of the tree // under it to the stack. while (root != null) { this.stack.push(root); root = root.left; } } /** * @return the next smallest number */ public int next() { // Node at the top of the stack is the next smallest element TreeNode topmostNode = this.stack.pop(); // Need to maintain the invariant. If the node has a right child, call the // helper function for the right child if (topmostNode.right != null) { this._leftmostInorder(topmostNode.right); } return topmostNode.val; } /** * @return whether we have a next smallest number */ public boolean hasNext() { return this.stack.size() > 0; } }

浙公网安备 33010602011771号