Facebook面试题专题2 - leetcode98. Validate Binary Search Tree/173. Binary Search Tree Iterator - Mark

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/a786150017/article/details/84856370

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

猜你喜欢

转载自blog.csdn.net/a786150017/article/details/84856370
今日推荐