leetcode [173]Binary Search Tree Iterator

Implement an iterator over a binary search tree (BST). Your iterator will be initialized with the root node of a BST.

Calling next() will return the next smallest number in the BST.

 

Example:

BSTIterator iterator = new BSTIterator(root);
iterator.next();    // return 3
iterator.next();    // return 7
iterator.hasNext(); // return true
iterator.next();    // return 9
iterator.hasNext(); // return true
iterator.next();    // return 15
iterator.hasNext(); // return true
iterator.next();    // return 20
iterator.hasNext(); // return false

 

Note:

  • next() and hasNext() should run in average O(1) time and uses O(h) memory, where h is the height of the tree.
  • You may assume that next() call will always be valid, that is, there will be at least a next smallest number in the BST when next() is called.
 

题目大意:

构造一个二叉树迭代器,按顺序返回二叉树的节点,next()函数得到二叉树的下一个节点,hasNext()判断是否有下一个节点。

解法:

其实就是按中序遍历的结果访问树的节点。我是将中序遍历的结果保存到一个数组中,然后按顺序返回数组中的值即可。

java:

class BSTIterator {
    List<Integer>l=new ArrayList<Integer>();

    public void dfs(TreeNode node){
        if(node==null) return;
        dfs(node.left);
        l.add(node.val);
        dfs(node.right);
    }

    public BSTIterator(TreeNode root) {
        dfs(root);
    }

    /** @return the next smallest number */
    public int next() {
        int res=l.remove(0);
        return res;
    }

    /** @return whether we have a next smallest number */
    public boolean hasNext() {
        return l.size()>0;
    }
}

最佳的解法:

使用一个栈来保存树的左孩子。

java:

class BSTIterator {
    private Stack<TreeNode>s=new Stack<TreeNode>();

    private void putAll(TreeNode node){
        while(node!=null) {
            s.add(node);
            node=node.left;
        }
    }

    public BSTIterator(TreeNode root) {
        putAll(root);
    }

    /** @return the next smallest number */
    public int next() {
        TreeNode tmpNode=s.pop();
        if(tmpNode.right!=null) putAll(tmpNode.right);
        return tmpNode.val;
    }

    /** @return whether we have a next smallest number */
    public boolean hasNext() {
        return !s.isEmpty();
    }
}

  

posted @ 2019-04-24 17:07  小白兔云  阅读(93)  评论(0编辑  收藏  举报