1. 程式人生 > >Facebook面試題專題2 - leetcode98. Validate Binary Search Tree/173. Binary Search Tree Iterator - Mark

Facebook面試題專題2 - leetcode98. Validate Binary Search Tree/173. Binary Search Tree Iterator - Mark

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