【LeetCode题解】173. 二叉搜索树迭代器

实现一个二叉搜索树迭代器。你将使用二叉搜索树的根节点初始化迭代器。

调用 next() 将返回二叉搜索树中的下一个最小的数。

提示:next() 和 hasNext() 操作的时间复杂度是 O(1),并使用 O(h) 内存,其中 h 是树的高度。
你可以假设 next() 调用总是有效的,也就是说,当调用 next() 时,BST 中至少存在一个下一个最小的数。

题解:

  • 对于二叉搜索树来说返回二叉搜索树中的下一个最小的数 = 中序遍历序列
  • 中序遍历 = left - visit - right ,非递归时使用辅助栈
  •  left - visit :从根结点开始,结点及左子树结点依次入栈
  • - right:已无左子树或左子树已被访问,弹栈,右子树结点也是一个二叉搜索树的root,递归处理
class BSTIterator {
    //二叉搜索树
    Stack s = new Stack<>();
    public BSTIterator(TreeNode root) {
        //
        dfs(root);
    }
    
    /** @return the next smallest number */
    public int next() {
        TreeNode tmp = s.pop();
        //中序遍历的后半段 -right 
        int ret = tmp.val;
        if(tmp.right!=null){
            //如有右子树,对右子树递归处理
            dfs(tmp.right);
        }
        return ret;
    }
    
    /** @return whether we have a next smallest number */
    public boolean hasNext() {
        if(!s.empty()){
            return true;
        }else{
            return false;
        }
    }
    //中序遍历的前半段 left-visit
    void dfs(TreeNode root){
        while(root!=null){
            s.push(root);
            root = root.left;
        }
    }
}

 

你可能感兴趣的:(LeetCode题解)