## Description

Given a binary tree, determine if it is a valid binary search tree (BST).

Assume a BST is defined as follows:

• The left subtree of a node contains only nodes with keys less than the node’s key.
• The right subtree of a node contains only nodes with keys greater than the node’s key.
• Both the left and right subtrees must also be binary search trees.

Example 1:

    2
/ \
1   3

Input: [2,1,3]
Output: true


Example 2:

    5
/ \
1   4
/ \
3   6

Input: [5,1,4,null,null,3,6]
Output: false
Explanation: The root node's value is 5 but its right child's value is 4.


## Solutions

验证给定的二叉树是不是二叉搜索树，即满足，中间结点的数大于左子树所有结点的值，小于右子树所有结点的值。

### 1. Recurrence

采用递归的方法实现，子节点取值可以在最小值和最大值之间，左子树要比根节点小，右子树要比根节点大：

# 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 validaBST(self, root, min_val, max_val):
if not root:
return True
if root.val <= min_val or root.val >= max_val:
return False
return self.validaBST(root.left, min_val, root.val) and \
self.validaBST(root.right, root.val, max_val)

def isValidBST(self, root):
"""
:type root: TreeNode
:rtype: bool
"""
return self.validaBST(root, float('-inf'), float('inf'))
# Runtime: 36 ms, faster than 72.76% of Python online submissions for Validate Binary Search Tree.
# Memory Usage: 16.4 MB, less than 66.11% of Python online submissions for Validate Binary Search Tree.


这里的问题是 hard code 了，因为设定了最大值和最小值，如果当树中类型发生改变后，这就不一定可行了。

# 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 validaBST(self, root, min_val, max_val):
if not root:
return True
if (min_val is not None and root.val <= min_val) or \
(max_val is not None and root.val >= max_val):
return False
return self.validaBST(root.left, min_val, root.val) and \
self.validaBST(root.right, root.val, max_val)

def isValidBST(self, root):
"""
:type root: TreeNode
:rtype: bool
"""
return self.validaBST(root, None, None)
# Runtime: 24 ms, faster than 99.22% of Python online submissions for Validate Binary Search Tree.
# Memory Usage: 16.3 MB, less than 73.10% of Python online submissions for Validate Binary Search Tree.


### 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
"""
self.prev = None
def validaBST(root):
if not root:
return True
# 如果左子树递归结果为 False 就返回 False
if not validaBST(root.left):
return False
# 前一个结点存的结果其实就是左子树的结果，如果左子树大于等于子节点就 返回 False
if self.prev and self.prev.val >= root.val:
return False
self.prev = root
return validaBST(root.right)
return validaBST(root)
# Runtime: 36 ms, faster than 72.76% of Python online submissions for Validate Binary Search Tree.
# Memory Usage: 16.9 MB, less than 10.30% of Python online submissions for Validate Binary Search Tree.


### 3. 中序遍历-Iterative

采用迭代的方式再写一遍：

# 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
"""
if not root:
return True
prev = None
stack = []
while root or stack:
while root:
stack.append(root)
root = root.left
root = stack.pop()
if prev and prev.val >= root.val:
return False
prev = root
root = root.right
return True
# Runtime: 32 ms, faster than 87.48% of Python online submissions for Validate Binary Search Tree.
# Memory Usage: 16.3 MB, less than 74.53% of Python online submissions for Validate Binary Search Tree.


注意外层的 while 中间用 or 连着，不用 and。