173. Binary Search Tree Iterator
2016-07-23 13:15
316 查看
题目:二叉搜索树(BST)迭代器
Implement an iterator over a binary search tree (BST). Your iterator will be initialized with the root node of a BST.
Calling
Note:
run in average O(1) time and uses O(h) memory, where h is the height of the tree.
题意:
实现一个二叉搜索树(BST)的迭代器。你的迭代器会使用BST的根节点初始化。
调用next()会返回BST中下一个最小的数字。
Note:
next()和hasNext()应该满足平均O(1)时间复杂度和O(h)空间复杂度,其中h是树的高度。
思路:
维护一个栈,从根节点开始,每次迭代地将根节点的左孩子压入栈,直到左孩子为空为止。调用next()方法时,弹出栈顶,如果被弹出的元素拥有右孩子,则以右孩子为根,将其左孩子迭代压栈。
代码:java版:8ms
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.
题意:
实现一个二叉搜索树(BST)的迭代器。你的迭代器会使用BST的根节点初始化。
调用next()会返回BST中下一个最小的数字。
Note:
next()和hasNext()应该满足平均O(1)时间复杂度和O(h)空间复杂度,其中h是树的高度。
思路:
维护一个栈,从根节点开始,每次迭代地将根节点的左孩子压入栈,直到左孩子为空为止。调用next()方法时,弹出栈顶,如果被弹出的元素拥有右孩子,则以右孩子为根,将其左孩子迭代压栈。
代码:java版:8ms
/** * Definition for binary tree * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ public class BSTIterator { private Stack<TreeNode> stack = new Stack<TreeNode>(); public BSTIterator(TreeNode root) { pushAll(root); } /** @return whether we have a next smallest number */ public boolean hasNext() { return !stack.isEmpty(); } /** @return the next smallest number */ public int next() { TreeNode tmpNode = stack.pop(); pushAll(tmpNode.right); return tmpNode.val; } private void pushAll(TreeNode node) { for (; node!=null; stack.push(node), node = node.left); } } /** * Your BSTIterator will be called like this: * BSTIterator i = new BSTIterator(root); * while (i.hasNext()) v[f()] = i.next(); */代码:C++版:26ms
/** * Definition for binary tree * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class BSTIterator { stack<TreeNode *> mystack; public: BSTIterator(TreeNode *root) { pushAll(root); } /** @return whether we have a next smallest number */ bool hasNext() { return !mystack.empty(); } /** @return the next smallest number */ int next() { TreeNode *tmpNode = mystack.top(); mystack.pop(); pushAll(tmpNode->right); return tmpNode->val; } private: void pushAll(TreeNode *node) { for (; node!=NULL; mystack.push(node), node = node->left); } }; /** * Your BSTIterator will be called like this: * BSTIterator i = BSTIterator(root); * while (i.hasNext()) cout << i.next(); */与以上C++版基本一致,pushAll循环实现细微差别:C++版:28ms
/** * Definition for binary tree * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class BSTIterator { stack<TreeNode *> mystack; public: BSTIterator(TreeNode *root) { pushAll(root); } /** @return whether we have a next smallest number */ bool hasNext() { return !mystack.empty(); } /** @return the next smallest number */ int next() { TreeNode *tmpNode = mystack.top(); mystack.pop(); pushAll(tmpNode->right); return tmpNode->val; } private: void pushAll(TreeNode *node) { while (node) { mystack.push(node); node = node->left; } } }; /** * Your BSTIterator will be called like this: * BSTIterator i = BSTIterator(root); * while (i.hasNext()) cout << i.next(); */
相关文章推荐
- spring bean id和bean name的区别
- 一种基于精简配置系统的块设备缓存装置及其方法
- 历届图灵奖 (Turing award)得奖名单
- [HDU 5741] Helter Skelter (二分)
- HashCode和equal
- <context:component-scan>使用说明
- 在Ubuntu上安装zsh
- Android Gallery画廊 兼容4.0以上版本
- POJ 2342 ——Anniversary party(树形dp基础)
- LVS+keepalived+nginx+tomcat部署实现
- 数据关系图
- Redis 事务
- 近期在做一个电商类app,listvise联动让我废了好多力。
- Python 之 if __name__ == '__main__'
- js中的面向对象程序设计(2)-创建对象
- python一
- linux内核之块设备二---真正派发请求request
- React Native 学习笔记
- 【转】如何在ubuntu下安装vmware-tools?
- cf700A As Fast As Possible