LeetCode 173. Binary Search Tree Iterator

原创 2016年11月01日 14:26:41

欢迎移步到我的个人博客

版权声明:本文为博主原创文章,转载请注明出处,谢谢!

昨天夜里

昨天夜里,家里很冷,心想着该睡了。突然灵机一动,想到自己很久没有刷题了,要不然带一道题入睡吧。心想着也不要太复杂的题,好久没刷了,太复杂估计一时半会儿想不出来。那就来道Easy的吧,看了一道,太简单了吧。索性换一道Medium难度的吧,于是随机的选了这一道。这一道的要求是时间复杂度O(1)、空间复杂度O(h),所以还得好好想想。

我还没有想出来怎么做就睡着了,当然(为什么当然?!),在入睡前我的思绪也没有全在这道题上,可能想着想着就飞了。今儿早一醒,也不想起,就想到了这道题,也是突然灵机一动想出来怎么做,然后迅速的把它搞定了。

流水结束。

原题要求

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.

我的解法

public class BSTIterator {
    Stack<TreeNode> stack = new Stack<TreeNode>();

    public BSTIterator(TreeNode root) {
        TreeNode temp = root;
        while (null != temp) {
            stack.push(temp);
            temp = temp.left;
        }
    }

    /** @return whether we have a next smallest number */
    public boolean hasNext() {
        if (!stack.empty()) {
            return true;
        }
        return false;
    }

    /** @return the next smallest number */
    public int next() {
        TreeNode temp = stack.pop();
        if (null != temp.right) {
            TreeNode newTemp = temp.right;
            while (null != newTemp) {
                stack.push(newTemp);
                newTemp = newTemp.left;
            }
        }
        return temp.val;
    }
}

解法思路

解法的本质就是dfs,只不过将dfs的结果做缓存,在获取next()以及调用hasNext()的时候都是基于这个缓存。

首先是初始化,大家都知道二分搜索树是左子树的值小于右子树的值,所以最小的值一定在从根节点开始的最左子树,如果对于这个结论不太理解的话,建议还是自己画一个或者几个二分搜索树来分析一下。所以初始化就是将从根节点开始到最左子树的过程中的所有节点放入。为什么用呢,很明显我们这里是一个先入后出的应用,所以只能用栈。

然后是hasNext()函数,这个就简单了,栈里有东西代表true,没有就是false;

接着是next()函数,这个是最重要的。根据之前的分析,可以知道栈里pop出来的就是当前最小的。这个时候要知道,这个节点可能是有右子树的,我们知道右子树的值是大于左子树以及父节点的,但是右子树的所有值是小于父节点的父节点也就是爷爷节点,所以在pop之后,需要将以右子树的根节点为起始,将从该根节点到其最左节点之间(包含)的所有节点入栈。最后返回pop出来的那个值。

这个思路可能说起来比较的不好理解,那么就在纸上画画,这个便于理解。

结束语

之前在LeetCode上刷了很多题了,也写过日志,但是没有这么详细的分析过,也是自己太懒的缘故。现在把思路梳理出来也是为了更好的沉淀一下,组织一下,当然也为了看我博客的人看的更舒畅,不要上来就一段代码,其实是对人对己都毫无帮助的。

最后说到父节点,我总能想起我小学老师,对,就是小学老师,他在讲父目录的时候格外开心,说长这么大了听得最多的就是亲河啊、校啊什么的,现在终于有了以命名的了!!!

相关文章推荐

<LeetCode OJ> 173. Binary Search Tree Iterator

Total Accepted: 50775 Total Submissions: 144066 Difficulty: Medium Implement an iterator over a...

[LeetCode]problem 173. Binary Search Tree Iterator

TAG中序遍历二叉查找树得到一个递增序列二叉查找树题目链接方法这道题挺有意思的,在二叉查找树的基础上建立一个迭代器,要求hasnext和next操作要是平均O(1)的,且最大空间消耗是O(h),h是树...

LeetCode - 173. Binary Search Tree Iterator

要求实现Binary Search Tree的hasNext()和next()操作,最小的元素自然是从root开始一直找左子树左子树直到为空,这是我们找到了我们需要的第一个元素,但是接下来的元素怎么办...

leetcode_173_Binary Search Tree Iterator

思路: 这道题想了好久,知道用中序遍历来解决,用一个list将遍历的元素存储起来一下就解决了,但是空间复杂度不行。具体怎么解决,如何控制程序的终止困扰了我好久。知道我想起来至多用O(h) memor...

[leetcode 173] Binary Search Tree Iterator-------为二叉搜索树实现迭代器功能

Question: Implement an iterator over a binary search tree (BST). Your iterator will be initiali...

Leetcode 173 Binary Search Tree Iterator 二叉查找树迭代器

实现一个适用于二叉查找树的迭代器,该迭代器通过二叉查找树的根结点来实例化。调用next()返回二叉查找树中的最小的元素。next()和hasNext()运行的平均时间复杂度为O(1),空间复杂度为O(...

[LeetCode]173.Binary Search Tree Iterator

【题目】 Implement an iterator over a binary search tree (BST). Your iterator will be initialized with...

leetcode-173:Binary Search Tree Iterator(Java)

Binary Search Tree Iterator Implement an iterator over a binary search tree (BST). Your iterato...

LeetCode173-Binary Search Tree Iterator

LeetCode 173 : Binary Search Tree Iterator Implement an iterator over a binary search tree (BST). Yo...

leetcode 173. Binary Search Tree Iterator-二叉搜索树迭代|中序遍历

原题链接:173. Binary Search Tree Iterator 【思路-Java】中序遍历非递归实现 我们知道二叉搜索树当前节点值总是大于左子树上的任一节点值,总是大于右子树上的任一节...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:LeetCode 173. Binary Search Tree Iterator
举报原因:
原因补充:

(最多只允许输入30个字)