Facebook面試題專題2 - leetcode98. Validate Binary Search Tree/173. Binary Search Tree Iterator - Mark
阿新 • • 發佈:2018-12-19
98. Validate Binary Search Tree
題目描述
給定一顆二叉樹,判斷其是否是有效的二叉搜尋樹。
二叉搜尋樹:1)節點的左子樹只包含小於該節點的值;2)節點的右子樹只包含大於該節點的值;3)左右子樹都是二叉搜尋樹。
例子
思想
只比較根節點值及其左右節點的值(×),因為要保證左子樹所有值都小於根節點。
所以,記錄某顆樹不能逾越的最小值和最大值。
1)如果當前結點超過了當前的大小範圍,則返回false;
2)否則遞迴遍歷左子樹,將左子樹的最大值更新為當前結點的值;遞迴遍歷右子樹,將右子樹的最小值更新為當前結點的值。
解法
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution(object):
def isValidBST(self, root):
"""
:type root: TreeNode
:rtype: bool
"""
return self.helper(root, float('inf'), float('-inf'))
def helper(self, root, maxVal, minVal):
if not root:
return True
if root.val >= maxVal or root.val <= minVal:
return False
return self.helper(root.left, root.val, minVal) and self.helper(root.right, maxVal, root.val)
173. Binary Search Tree Iterator
MS面試題
題目描述
在二叉搜尋樹上實現一個迭代器。迭代器初始化BST的根節點。
呼叫next()返回BST 下一個最小的數。要求時間複雜度O(1)
例子
略
思想
非遞迴中序遍歷的變形。注意__init__是初始化,呼叫next進行一次彈出操作。
1)用棧來模擬BST的中序遍歷過程,當前結點進棧,代表它的左子樹正在被訪問。棧頂結點代表當前訪問到的結點。
2)求後繼時,只需要彈出棧頂結點,取出它的值。然後將它的右兒子以及右兒子的左兒子等一系列結點進棧,這一步代表找右子樹中的最左子結點,並記錄路徑上的所有結點。
3)判斷是否還存在後繼只需要判斷棧是否為空即可,因為棧頂結點是下一次即將被訪問到的結點。
解法
# Definition for a binary tree node
# class TreeNode(object):
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class BSTIterator(object):
def __init__(self, root):
"""
:type root: TreeNode
"""
self.stack = []
while root:
self.stack.append(root)
root = root.left
def hasNext(self):
"""
:rtype: bool
"""
return self.stack
def next(self):
"""
:rtype: int
"""
node = self.stack.pop()
res = node.val
node = node.right
while node:
self.stack.append(node)
node = node.left
return res
# Your BSTIterator will be called like this:
# i, v = BSTIterator(root), []
# while i.hasNext(): v.append(i.next())