zoukankan      html  css  js  c++  java
  • LintCode-Implement Iterator of Binary Search Tree

    Design an iterator over a binary search tree with the following properties:

    1. Elements are visited in ascending order (i.e. an inorder traversal)
    2. next() and hasNext() queries run in O(1) time in average.
    Example

    For the following binary search tree, inorder traversal by using iterator is [1, 6, 10, 11, 12]

          10

        /    

     1          11

                 

           6           12

    Challenge
    Extra memory usage O(h), h is the height of the tree.
    Super Star: Extra memory usage O(1)
     
    Solution: O(h) space.
     1 /**
     2  * Definition of TreeNode:
     3  * public class TreeNode {
     4  *     public int val;
     5  *     public TreeNode left, right;
     6  *     public TreeNode(int val) {
     7  *         this.val = val;
     8  *         this.left = this.right = null;
     9  *     }
    10  * }
    11  * Example of iterate a tree:
    12  * Solution iterator = new Solution(root);
    13  * while (iterator.hasNext()) {
    14  *    TreeNode node = iterator.next();
    15  *    do something for node
    16  * }
    17  */
    18 public class Solution {
    19     private Stack<TreeNode> nodeStack;
    20 
    21     //@param root: The root of binary tree.
    22     public Solution(TreeNode root) {
    23         nodeStack = new Stack<TreeNode>();
    24         //Initialize first, then determine null, otherwise, the hasNext() function will cause problem.
    25         if (root==null) return;
    26         nodeStack.push(root);
    27         TreeNode cur = root.left;
    28         while (cur!=null){
    29             nodeStack.push(cur);
    30             cur = cur.left;
    31         }
    32     }
    33 
    34     //@return: True if there has next node, or false
    35     public boolean hasNext() {
    36         if (nodeStack.isEmpty()) return false;
    37         else return true;
    38     }
    39     
    40     //@return: return next node
    41     public TreeNode next() {
    42         if (nodeStack.isEmpty()) return null;
    43         TreeNode next = nodeStack.pop();
    44         if (next.right==null) return next;
    45         else {
    46             nodeStack.push(next.right);
    47             TreeNode cur = next.right.left;
    48             while (cur!=null){
    49                 nodeStack.push(cur);
    50                 cur = cur.left;
    51             }
    52             return next;
    53         }
    54     }
    55 }
     
  • 相关阅读:
    并查集图冲突hdu1272
    CentOS 7通过yum安装fcitx五笔输入法
    近期的技术问题让云供应商进行预设加密
    POJ 1166 The Clocks (暴搜)
    windows中的mysql修改管理员密码
    Visio画UML类图、序列图 for Java
    js中的时间与毫秒数互相转换
    java.lang.OutOfMemoryError: unable to create new native thread 居然是MQ问题
    WEB移动应用框架构想(转载)
    Android SDK安装教程
  • 原文地址:https://www.cnblogs.com/lishiblog/p/4194933.html
Copyright © 2011-2022 走看看