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

原创 2016年06月01日 11:37:01
原题链接:173. Binary Search Tree Iterator

【思路-Java】中序遍历非递归实现

我们知道二叉搜索树当前节点值总是大于左子树上的任一节点值,总是大于右子树上的任一节点值。要从小到大取出该节点,我们可以采用二叉树的中序遍历,该思路借用一个栈来实现,如果对二叉树的中序遍历思路不是很清晰的,可以参考我的另一篇博文:leetcode 94. Binary Tree Inorder Traversal-中序遍历|递归|非递归

public class BSTIterator {
    Stack<TreeNode> stack = new Stack<TreeNode>();
    public BSTIterator(TreeNode root) {
        while(root != null) {
            stack.add(root);
            root = root.left;
        }
    }

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

    /** @return the next smallest number */
    public int next() {
        TreeNode temp = stack.pop();
        int val = temp.val;
        if(temp.right != null) {
            temp = temp.right;
            while (temp != null) {
                stack.add(temp);
                temp = temp.left;
            }
        }
        return val;
    }
}
61 / 61 test cases passed. Runtime: 6 ms  Your runtime beats 78.97% of javasubmissions.


【思路2-Java】
如果我们打破常规,不用栈来实现,那么我们就需要变换策略,需要申请几枚指针:


该思路就是借助指针,逐一将最左端的点加到 root 指针的右边

public class BSTIterator {
    TreeNode root = new TreeNode(0);
    public BSTIterator(TreeNode root) {
        this.root.right = root;
    }

    /** @return whether we have a next smallest number */
    public boolean hasNext() {
        return root.right != null;
    }

    /** @return the next smallest number */
    public int next() {
        TreeNode next = root.right;
        if (next.left == null) {
            root = next;
            return next.val;
        }
        TreeNode right = root.right;
        TreeNode parent = root;
        while(next.left != null) {
            parent = next;
            next = next.left;
        }
        parent.left = next.right;
        root.right = next;
        next.right = right;
        root = root.right;
        return root.val;
    }
}
61 / 61 test cases passed. Runtime: 5 ms  Your runtime beats 94.32% of javasubmissions.

版权声明:本文为博主原创文章,未经博主允许不得转载。

java实现二叉树的先序、中序和后序迭代器

二叉树是每个节点最多有两个zish
  • sima1989
  • sima1989
  • 2014年10月07日 13:49
  • 1732

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

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

笛卡尔树 中序遍历判断是否为二叉搜索树

笛卡尔树是一种特殊的二叉树,其结点包含两个关键字K1和K2。首先笛卡尔树是关于K1的二叉搜索树,即结点左子树的所有K1值都比该结点的K1值小,右子树的所有K1值都比该结点的K1值大。其次所有结点的K2...
  • maogouji5858
  • maogouji5858
  • 2016年12月13日 19:33
  • 275

二叉搜索树的迭代器

我们经常使用着我们并不熟悉的函数/类,我们只知道它们所提供的接口以及怎样使用。这就像我们开车在马路上,你可能并不知道汽车是如何运行,或许你会说这并不需要知道。但至少知道一些回在车抛锚的时候你能做一些事...
  • fengasdfgh
  • fengasdfgh
  • 2016年11月15日 23:12
  • 441

根据前序遍历判断二叉搜索树

题意:给你一个二叉树的前序遍历序列,让你判断是不是二叉搜索树(左子树小于根,右子树大于根)或其镜像。如果是,输出后序遍历序列。 #include #include using namespace ...
  • Roosevelty
  • Roosevelty
  • 2016年04月09日 17:15
  • 900

PAT - 甲级 - 1099. Build A Binary Search Tree (30)(二叉搜索树+层次遍历+中序遍历)

题目描述: A Binary Search Tree (BST) is recursively defined as a binary tree which has the following ...
  • qq_34594236
  • qq_34594236
  • 2017年03月30日 23:13
  • 363

二叉树遍历的应用(路径和问题,判断是否是二叉搜索树,判断是否是二叉平衡树)

现在越发觉得关于树的问题真是千变万化,随便改一个条件又会是一个新的问题。 问题:一棵二叉树每个节点包含一个整数,请设计一个算法输出所有满足条件的路径:此路径上所有节点之和等于给定值。注意此类路径不...
  • u012501459
  • u012501459
  • 2015年08月25日 20:53
  • 903

判断是否是二叉查找树的后序遍历结果

题目: 输入一个整数数组,判断该数组是不是某二元查找树的后序遍历的结果。如果是返回true,否则返回false。 例如输入5、7、6、9、11、10、8,由于这一整数序列是如下树的后序遍历结果:  ...
  • LaoJiu_
  • LaoJiu_
  • 2016年03月07日 16:22
  • 1421

九度OJ-题目1367:二叉搜索树的后序遍历序列

题目链接地址: 九度OJ-题目1367:二叉搜索树的后序遍历序列 题目描述: 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的...
  • pengyan0812
  • pengyan0812
  • 2015年06月08日 11:02
  • 1180

二叉树遍历的所有递归和迭代实现

@[二叉树|排列|前序|中序|后序]无论是在面试过程中还是实际项目中,我们都会遇见二叉树的遍历,当然这个只要了解了原理,其实很简单;二叉树的排列包括(注意顺序) * 前序排列:先遍历树的跟节点,然后...
  • u010388497
  • u010388497
  • 2016年06月16日 02:33
  • 1271
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:leetcode 173. Binary Search Tree Iterator-二叉搜索树迭代|中序遍历
举报原因:
原因补充:

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