《leetCode》:Binary Search Tree Iterator

本文介绍了一种在二叉搜索树中实现迭代器的方法,该迭代器可以在平均O(1)的时间复杂度内返回树中的下一个最小元素,并使用O(h)的空间复杂度,其中h是树的高度。

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.

Note: next() and hasNext() should run in average O(1) time and uses O(h) memory, where h is the height of the tree.

思路一:空间复杂度为O(N)

思路:由BST的特点可得根据中序遍历得到的节点集就是有序的。因此,借用一个容器将中序遍历的结果保存即可。

实现代码如下:

public class BSTIterator {

    private List<TreeNode> list = new ArrayList<TreeNode> ();
    private int totalNodeNum;
    private int num;
    public BSTIterator(TreeNode root) {
        saveNodeToList(root);
        totalNodeNum = list.size();
        num = 0;
    }

    private void saveNodeToList(TreeNode root) {
        if(root==null){
            return ;
        }
        if(root.left!=null){
            saveNodeToList(root.left);
        }
        list.add(root);
        if(root.right!=null){
            saveNodeToList(root.right);
        }
    }

    /** @return whether we have a next smallest number */
    public boolean hasNext() {
        return (num<totalNodeNum);
    }

    /** @return the next smallest number */
    public int next() {
        int val = list.get(num).val;
        num ++;
        return val;
    }
}

测试结果AC了。

但是,此种方法hasNext和next的时间复杂度为O(1),但是空间复杂度为O(N),其中N为树的节点个数,不符合题意。
虽然AC 了,但我们还需要继续思考其它更好的方法。

思路二

借用Stack来进行存储树节点。空间复杂度为O(h);

实现代码如下:

public class BSTIterator {

    private Stack<TreeNode> s;
    public BSTIterator(TreeNode root) {
        s =new Stack<TreeNode> ();
        pushLeft(root);
    }

    private void pushLeft(TreeNode root) {
        while(root!=null){
            s.push(root);
            root = root.left;
        }
    }


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

    /** @return the next smallest number */
    public int next() {
        TreeNode t = s.pop();
        pushLeft(t.right);
        return t.val;
    }
}

运行结果如下:

小结

对比两种方法的运行结果可以得到,第一种的空间复杂度为O(N),运行时间为:5ms;第二种的空间复杂度为O(h),运行时间为:7ms;反应了这样的结论:利用空间换取时间。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值