實現一個二叉搜索樹迭代器類BSTIterator ,表示一個按中序遍歷二叉搜索樹(BST)的迭代器:
BSTIterator(TreeNode root) 初始化 BSTIterator 類的一個對象。BST 的根節點 root 會作為構造函數的一部分給出。指針應初始化為一個不存在于 BST 中的數字,且該數字小于 BST 中的任何元素。
boolean hasNext() 如果向指針右側遍歷存在數字,則返回 true ;否則返回 false 。
int next()將指針向右移動,然后返回指針處的數字。
注意,指針初始化為一個不存在于 BST 中的數字,所以對 next() 的首次調用將返回 BST 中的最小元素。
你可以假設 next() 調用總是有效的,也就是說,當調用 next() 時,BST 的中序遍歷中至少存在一個下一個數字。
示例:
輸入
[“BSTIterator”, “next”, “next”, “hasNext”, “next”, “hasNext”, “next”, “hasNext”, “next”, “hasNext”]
[[[7, 3, 15, null, null, 9, 20]], [], [], [], [], [], [], [], [], []]
輸出
[null, 3, 7, true, 9, true, 15, true, 20, false]
解釋
BSTIterator bSTIterator = new BSTIterator([7, 3, 15, null, null, 9, 20]);
bSTIterator.next(); // 返回 3
bSTIterator.next(); // 返回 7
bSTIterator.hasNext(); // 返回 True
bSTIterator.next(); // 返回 9
bSTIterator.hasNext(); // 返回 True
bSTIterator.next(); // 返回 15
bSTIterator.hasNext(); // 返回 True
bSTIterator.next(); // 返回 20
bSTIterator.hasNext(); // 返回 False
解題思路
使用棧實現中序遍歷
當前遍歷的節點出棧時,將它右節點以及右節點上的所有子節點入棧,實現中序遍歷
代碼
/*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val = val; }* TreeNode(int val, TreeNode left, TreeNode right) {* this.val = val;* this.left = left;* this.right = right;* }* }*/class BSTIterator {Stack<TreeNode> stack=new Stack<>();public BSTIterator(TreeNode root) {while (root!=null){stack.add(root);root=root.left;}}public int next() {TreeNode pop = stack.pop();TreeNode right = pop.right;while (right!=null){stack.add(right);right=right.left;}return pop.val;}public boolean hasNext() {return !stack.isEmpty();}}
/*** 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();*/