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-173:Binary Search Tree Iterator(Java)

Binary Search Tree Iterator Implement an iterator over a binary search tree (BST). Your iterato...
  • wen1158646729
  • wen1158646729
  • 2015年08月18日 10:58
  • 1128

leetcode 173: Binary Search Tree Iterator

Binary Search Tree Iterator Total Accepted: 1141 Total Submissions: 3857 Implement an iterat...
  • xudli
  • xudli
  • 2015年01月02日 12:44
  • 4102

[Java]leetcode173 Binary Search Tree Iterator

Implement an iterator over a binary search tree (BST). Your iterator will be initialized with the ro...
  • fumier
  • fumier
  • 2015年04月10日 08:52
  • 633

LeetCode-173. Binary Search Tree Iterator (JAVA)BST的迭代

LeetCode-173. Binary Search Tree Iterator (JAVA)BST的迭代,二叉查找树
  • mine_song
  • mine_song
  • 2017年04月28日 13:08
  • 237

[LeetCode 173] Binary Search Tree Iterator

Implement an iterator over a binary search tree (BST). Your iterator will be initialized with the ro...
  • sbitswc
  • sbitswc
  • 2015年08月21日 14:11
  • 596

Leetcode: Binary Search Tree Iterator

Implement an iterator over a binary search tree (BST). Your iterator will be initialized with the ro...
  • doc_sgl
  • doc_sgl
  • 2015年01月03日 22:13
  • 3630

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

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

Validate Binary Search Tree -- LeetCode

原题链接: http://oj.leetcode.com/problems/validate-binary-search-tree/  这道题是检查一颗二分查找树是否合法,二分查找树是非常常见的一种...
  • linhuanmars
  • linhuanmars
  • 2014年04月16日 04:34
  • 11688

Leetcode 98. Validate Binary Search Tree C++及javascript解答,不同语言不同玩法

题意:给定一棵二叉树,写程序判断这颗二叉树是否为合法的二分查找树(对于节点root,其所有左子树中节点都满足 node.val root.val) 转载请注明出处:http://blog.csdn...
  • sunny606
  • sunny606
  • 2017年03月15日 22:03
  • 210

leetcode 270: Closest Binary Search Tree Value

Closest Binary Search Tree Value Total Accepted: 1815 Total Submissions: 6418 Difficult...
  • xudli
  • xudli
  • 2015年09月26日 09:43
  • 5228
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:LeetCode 173. Binary Search Tree Iterator
举报原因:
原因补充:

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