0x00 题目
实现一个二叉搜索树迭代器类 BSTIterator 表示一个按 中序遍历 二叉搜索树(BST)的迭代器:
BSTIterator(TreeNode root) 初始化 BSTIterator 类的一个对象
BST 的根节点 root 会作为构造函数的一部分给出
指针应初始化为一个不存在于 BST 中的数字,且该数字小于 BST 中的任何元素
boolean hasNext() 如果向指针右侧遍历存在数字,则返回 true ;否则返回 falseint next() 将指针向右移动,然后返回指针处的数字
注意,指针初始化为一个不存在于 BST 中的数字
所以对 next() 的首次调用将返回 BST 中的最小元素
你可以假设 next() 调用总是有效的
也就是说,当调用 next() 时,BST 的中序遍历中至少存在一个下一个数字
0x01 思路
可以直接对二叉搜索树做一次完全的递归遍历
获取 中序遍历 的全部结果并保存在 数组 中
随后,我们利用得到的数组本身来实现迭代器
复杂度分析
时间复杂度:初始化需要 O(n) 的时间
其中 n 为树中节点的数量
随后每次调用只需要 O(1) 的时间
空间复杂度:O(n),因为需要保存中序遍历的全部结果
0x02 解法
语言:Swift
树节点:TreeNode
public class TreeNode {
public var val: Int
public var left: TreeNode?
public var right: TreeNode?
public init() { self.val = 0; self.left = nil; self.right = nil; }
public init(_ val: Int) { self.val = val; self.left = nil; self.right = nil; }
public init(_ val: Int, _ left: TreeNode?, _ right: TreeNode?) {
self.val = val
self.left = left
self.right = right
}
}解法:
class BSTIterator {
var index: Int = 0
var array: [Int] = []
init(_ root: TreeNode?) {
inorder(root)
}
// 中序遍历
private func inorder(_ root: TreeNode?) {
guard let r = root else { return }
inorder(r.left)
array.append(r.val)
inorder(r.right)
}
// 下一个元素
func next() -> Int {
if index < array.count {
let res = array[index]
index += 1
return res
}
return 0
}
// 是否还有下一个
func hasNext() -> Bool {
return index < array.count
}
}










