给定一个二叉树,判断其是否是一个有效的二叉搜索树。
假设一个二叉搜索树具有如下特征:
- 节点的左子树只包含小于当前节点的数。
- 节点的右子树只包含大于当前节点的数。
- 所有左子树和右子树自身必须也是二叉搜索树。
示例 1:
输入:
输出: true
示例 2:
输入:
输出: false
解释: 输入为: [5,1,4,null,null,3,6]。根节点的值为 5,但是其右子节点值为 4。
Python 解答:
1.递归判断
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def isValidBST(self, root: TreeNode) -> bool:
def isTrue(root, lvalue, rvalue):
if not root:
return True
elif lvalue < root.val < rvalue:
if not root.left and not root.right:
return True
elif not root.left and root.right:
return isTrue(root.right, root.val, rvalue)
elif root.left and not root.right:
return isTrue(root.left, lvalue, root.val)
else:
return isTrue(root.left, lvalue, root.val) and isTrue(root.right, root.val, rvalue)
else:
return False
return isTrue(root, float('-inf'), float('inf'))
2.中序遍历
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def isValidBST(self, root: TreeNode) -> bool:
pre = float('-inf')
flag = True
def inOrder(root):
nonlocal pre, flag
if not root or not flag:
return
inOrder(root.left)
if root.val <= pre:
flag = False
pre = root.val
inOrder(root.right)
inOrder(root)
return flag
留言