1. 程式人生 > 實用技巧 >LeetCode 173. 二叉搜尋樹迭代器

LeetCode 173. 二叉搜尋樹迭代器

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()