Files
LeetCode-Go/website/content/ChapterFour/0173.Binary-Search-Tree-Iterator.md
2020-08-09 00:39:24 +08:00

118 lines
2.6 KiB
Markdown
Executable File
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# [173. Binary Search Tree Iterator](https://leetcode.com/problems/binary-search-tree-iterator/)
## 题目
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**:
![](https://assets.leetcode.com/uploads/2018/12/25/bst-tree.png)
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.
## 题目大意
实现一个二叉搜索树迭代器。你将使用二叉搜索树的根节点初始化迭代器。调用 next() 将返回二叉搜索树中的下一个最小的数。
## 解题思路
- 用优先队列解决即可
## 代码
```go
package leetcode
import "container/heap"
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
// BSTIterator define
type BSTIterator struct {
pq PriorityQueueOfInt
count int
}
// Constructor173 define
func Constructor173(root *TreeNode) BSTIterator {
result, pq := []int{}, PriorityQueueOfInt{}
postorder(root, &result)
for _, v := range result {
heap.Push(&pq, v)
}
bs := BSTIterator{pq: pq, count: len(result)}
return bs
}
/** @return the next smallest number */
func (this *BSTIterator) Next() int {
this.count--
return heap.Pop(&this.pq).(int)
}
/** @return whether we have a next smallest number */
func (this *BSTIterator) HasNext() bool {
return this.count != 0
}
/**
* Your BSTIterator object will be instantiated and called as such:
* obj := Constructor(root);
* param_1 := obj.Next();
* param_2 := obj.HasNext();
*/
type PriorityQueueOfInt []int
func (pq PriorityQueueOfInt) Len() int {
return len(pq)
}
func (pq PriorityQueueOfInt) Less(i, j int) bool {
return pq[i] < pq[j]
}
func (pq PriorityQueueOfInt) Swap(i, j int) {
pq[i], pq[j] = pq[j], pq[i]
}
func (pq *PriorityQueueOfInt) Push(x interface{}) {
item := x.(int)
*pq = append(*pq, item)
}
func (pq *PriorityQueueOfInt) Pop() interface{} {
n := len(*pq)
item := (*pq)[n-1]
*pq = (*pq)[:n-1]
return item
}
```