LeetCode 173. 二叉搜尋樹迭代器
阿新 • • 發佈:2020-12-01
173. 二叉搜尋樹迭代器
Difficulty: 中等
實現一個二叉搜尋樹迭代器。你將使用二叉搜尋樹的根節點初始化迭代器。
呼叫 next()
將返回二叉搜尋樹中的下一個最小的數。
示例:
BSTIterator iterator = new BSTIterator(root); iterator.next(); // 返回 3 iterator.next(); // 返回 7 iterator.hasNext(); // 返回 true iterator.next(); // 返回 9 iterator.hasNext(); // 返回 true iterator.next(); // 返回 15 iterator.hasNext(); // 返回 true iterator.next(); // 返回 20 iterator.hasNext(); // 返回 false
提示:
next()
和hasNext()
操作的時間複雜度是O(1),並使用O(h) 記憶體,其中_h_是樹的高度。- 你可以假設
next()
呼叫總是有效的,也就是說,當呼叫next()
時,BST 中至少存在一個下一個最小的數。
Solution
Language: 全部題目
二叉排序樹的左子樹上的節點均小於右子樹的節點,放在樹裡面任意一個節點都成立。根據題意,實際上就是需要你實現二叉搜尋樹的中序遍歷,並且要求時間複雜度為 O(1),並使用O(h) 記憶體。
對於二叉樹的遍歷一般有深度優先和廣度優先,深度優先搜尋一般結合棧實現,廣度優先搜尋一般結合佇列實現,掌握這兩個公式能解決大部分樹的題目。因為題目要求使用O(h
# Definition for a binary tree node. # class TreeNode: # def __init__(self, x): # self.val = x # self.left = None # self.right = None class BSTIterator: # 二叉樹的中序遍歷 def __init__(self, root: TreeNode): self.stack = [] self.helper(root) def next(self) -> int: """ @return the next smallest number """ while self.stack: tmpNode = self.stack.pop() if tmpNode.right: self.helper(tmpNode.right) return tmpNode.val def hasNext(self) -> bool: """ @return whether we have a next smallest number """ return len(self.stack) > 0 def helper(self, root): while root: self.stack.append(root) root = root.left # Your BSTIterator object will be instantiated and called as such: # obj = BSTIterator(root) # param_1 = obj.next() # param_2 = obj.hasNext()