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