leetcode98

98. Validate Binary Search Tree

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:

1
2
3
4
5
Input:
2
/ \
1 3
Output: true

Example 2:

1
2
3
4
5
6
    5
/ \
1 4
/ \
3 6
Output: false

Explanation: The input is: [5,1,4,null,null,3,6]. The root node’s value
is 5 but its right child’s value is 4.

Idea

Recurison inorderly. Or divide and conquer.

Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
class Solution(object):
def isValidBST(self, root):
"""
:type root: TreeNode
:rtype: bool
"""
self.order = []
self.inorder(root)

prev = float('-inf')
for node in self.order:
if node.val <= prev:
return False
prev = node.val

return True

def inorder(self, root):
"""
:type root: TreeNode
:rtype: bool
"""
if root is None:
return

self.inorder(root.left)
self.order.append(root)
self.inorder(root.right)

# version 2
# class Solution(object):
# def isValidBST(self, root):
# """
# :type root: TreeNode
# :rtype: bool
# """
# res, _, _ = self.helper(root)
# return res

# def helper(self, root):
# """
# :type root: TreeNode
# :rtype: bool
# """
# if root is None:
# return True, float('-inf'), float('inf')
# left, leftmax, leftmin = self.helper(root.left)
# right, rightmax, rightmin = self.helper(root.right)

# rootmax = max(root.val, max(leftmax, rightmax))
# rootmin = min(root.val, min(rightmin, leftmin))

# if left and right:
# return leftmax < root.val and root.val < rightmin, rootmax, rootmin

# return False, float('-inf'), float('inf')