• 0173. Binary Search Tree Iterator (M)


    Binary Search Tree Iterator (M)

    题目

    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.

    Example:

    BSTIterator iterator = new BSTIterator(root);
    iterator.next();    // return 3
    iterator.next();    // return 7
    iterator.hasNext(); // return true
    iterator.next();    // return 9
    iterator.hasNext(); // return true
    iterator.next();    // return 15
    iterator.hasNext(); // return true
    iterator.next();    // return 20
    iterator.hasNext(); // return false
    

    Note:

    • next() and hasNext() should run in average O(1) time and uses O(h) memory, where h is the height of the tree.
    • You may assume that next() call will always be valid, that is, there will be at least a next smallest number in the BST when next() is called.

    题意

    实现一个BST迭代器,要求next()和hasNext()的平均时间复杂度为(O(1))且空间复杂度为(O(h))

    思路

    如果没有复杂度限制,那么最简单的方法就是先一遍中序遍历将所有值记录下来,调用next()时挨个返回就行。空间复杂度为(O(h)),做法就参考中序遍历的迭代实现:初始化时先将最左侧的边存储下来,每次调用next()时,栈顶元素就是下一个应返回的结点,出栈后将该结点右子树的最左侧边存入栈。重复上述过程,栈中元素数量最大为树高,且查询平均复杂度为(O(1))


    代码实现

    Java

    class BSTIterator {
        private Deque<TreeNode> stack;
        private int index;
    
        public BSTIterator(TreeNode root) {
            stack = new ArrayDeque<>();
            while (root != null) {
                stack.push(root);
                root = root.left;
            }
        }
    
        /**
         * @return the next smallest number
         */
        public int next() {
            TreeNode node = stack.pop();
            TreeNode tmp = node.right;
            while (tmp != null) {
                stack.push(tmp);
                tmp = tmp.left;
            }
            return node.val;
        }
    
        /**
         * @return whether we have a next smallest number
         */
        public boolean hasNext() {
            return !stack.isEmpty();
        }
    }
    

    JavaScript

    /**
     * Definition for a binary tree node.
     * function TreeNode(val, left, right) {
     *     this.val = (val===undefined ? 0 : val)
     *     this.left = (left===undefined ? null : left)
     *     this.right = (right===undefined ? null : right)
     * }
     */
    /**
     * @param {TreeNode} root
     */
    var BSTIterator = function (root) {
      this.stack = []
      while (root) {
        this.stack.push(root)
        root = root.left
      }
    }
    
    /**
     * @return {number}
     */
    BSTIterator.prototype.next = function () {
      let top = this.stack.pop()
      let p = top.right
      while (p) {
        this.stack.push(p)
        p = p.left
      }
      return top.val
    }
    
    /**
     * @return {boolean}
     */
    BSTIterator.prototype.hasNext = function () {
      return this.stack.length
    }
    
  • 相关阅读:
    Java实现各种内部排序算法
    Java实现堆排序(大根堆)
    Java对象的序列化和反序列化
    Java实现链式存储的二叉查找树(递归方法)
    337. House Robber III(包含I和II)
    318. Maximum Product of Word Lengths
    114. Flatten Binary Tree to Linked List
    106. Construct Binary Tree from Inorder and Postorder Traversal
    105. Construct Binary Tree from Preorder and Inorder Traversal
    96. Unique Binary Search Trees(I 和 II)
  • 原文地址:https://www.cnblogs.com/mapoos/p/14110402.html
Copyright © 2020-2023  润新知